I recently needed to find the parent location of a computer, it’s parent distinguishedName. I wanted a function that would:
– work with a broader scope of AD objects, like users, OUs,…
– support piping objects from regular ActiveDirectory module or from itself
Here’s what I wanted to achieve visually
# Pipe an ADUser object
Get-ADUser 'Skywalker' | Get-ADObjectParentPath
# Pipe a DN string (you'd get the 'Users' OU)
'CN=Luc Skywalker,OU=Users,OU=Prod,DC=Star,DC=Wars,DC=com' | Get-ADObjectParentPath
# Do it twice, (you'd get the 'Prod' OU)
'CN=Luc Skywalker,OU=Users,OU=Prod,DC=Star,DC=Wars,DC=com' |
Get-ADObjectParentPath | Get-ADObjectParentPath
Here’s what I quickly wrote to meet my needs.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Function Get-ADObjectParentPath { | |
<# | |
.SYNOPSIS | |
Get the parent DN location of an AD object. | |
.DESCRIPTION | |
Get the parent DN location of an AD object. | |
.PARAMETER DistinguishedName | |
DistinghedNames objects passed as input (from AD cmdlets). | |
.PARAMETER DN | |
DistinghedNames strings passed as input | |
.EXAMPLE | |
Get-ADUser Skywalker | Get-ADObjectParentPath | |
.EXAMPLE | |
'CN=Luc Skywalker,OU=Users,OU=Prod,DC=Star,DC=Wars,DC=com' | Get-ADObjectParentPath | |
#> | |
[CmdletBinding(DefaultParameterSetName = 'String')] | |
Param( | |
[Parameter(ParameterSetName = 'Obj', Mandatory,ValueFromPipelineByPropertyName)] | |
[ValidateNotNullOrEmpty()] | |
$DistinguishedName, | |
[Parameter(ParameterSetName = 'String', Mandatory,ValueFromPipeline)] | |
[ValidateNotNullOrEmpty()] | |
[string[]]$DN | |
) | |
Begin { | |
if (-not(Test-Path -Path 'AD:\' -PathType Container)) { | |
Write-Warning -Message 'Failed to find the AD drive, aborting' | |
break | |
} | |
} | |
Process { | |
if ($DistinguishedName) { | |
$DistinguishedName | | |
ForEach-Object -Process { | |
$parent = ((Get-Item "AD:\$($_)" -ErrorAction SilentlyContinue).PSParentPath | Split-Path -NoQualifier ) -replace '//RootDSE/','' | |
if ($parent) { | |
$parent | |
} | |
} | |
} | |
if ($DN ) { | |
$DN | | |
ForEach-Object -Process { | |
if (Test-Path -Path "AD:\$($_)" -ErrorAction SilentlyContinue) { | |
$parent = ((Get-Item "AD:\$($_)" -ErrorAction SilentlyContinue).PSParentPath | Split-Path -NoQualifier ) -replace '//RootDSE/','' | |
if ($parent) { | |
$parent | |
} | |
} else { | |
Write-Warning -Message "Path AD:\$($_) not found" | |
} | |
} | |
} | |
} | |
End {} | |
} |
Pingback: Dew Drop – May 31, 2021 (#3454) – Morning Dew by Alvin Ashcraft