function ConvertTo-DistinguishedName{ [CmdletBinding()] Param( [Parameter(Mandatory=$true,Position=0,ValueFromPipeline=$true)] $CanonicalName ) Begin{ # StringBuilders used to build DestinguishedName and LDAP query $dn = [System.Text.StringBuilder]::new() $ldapQuery = [System.Text.StringBuilder]::new() # Static variables $objectTypes = 'OU','CN','DC' # StrictMode bypass $r = '' } Process{ [void]$dn.Clear() $arrParts = $CanonicalName.Trim('/') -Split '(?<!\\)/' foreach($part in $arrParts){ if(!$part){ Write-Error "CanonicalName '$CanonicalName' incorrect" } } # Adding DC [void]$dn.Append($($arrParts[0].Split('.')|ForEach-Object {[string]$r += "DC=$_,"} -End {$r.Trim(','); $r = $null})) if($arrParts.Count -gt 1){ # Check if leaf object is located within one or multiple OUs if($arrParts.Count -gt 2){ # Adding OUs foreach($part in $arrParts[1..($arrParts.Count -2)]){ [void]$dn.Insert(0, "OU=$part,") } } # Adding leaf [void]$dn.Insert(0, "=$($arrParts[$arrParts.Count - 1]),") foreach($o in $objectTypes){ [void]$ldapQuery.Clear() [void]$ldapQuery.Append("LDAP://$o") [void]$ldapQuery.Append($dn) try{ $works = [adsi]::Exists($ldapQuery) } catch{ if($_.Exception.HResult -ne -2146233087){ throw $_.Exception } } if($works){ break } } } if(!$works){ Write-Error "The object '$CanonicalName' could not be found" } else{ Write-Output "$o$($dn.ToString())" } # Cleanup $works = $false } End{ # Nullify StringBuilders $dn = $null $ldapQuery = $null } }