Como mencionado nos comentários de Mike , você precisará passar por cada nível na árvore e testar a existência dos ancestrais das UOs e, em seguida, criar os que não existem, do nível mais alto e abaixo.
Contanto que New-ADOrganisationalUnit
não tenha um parâmetro -Recurse, essa é a maneira mais elegante que eu pude pensar:
function New-OrganizationalUnitFromDN
{
[CmdletBinding(SupportsShouldProcess=$true)]
param(
[string]$DN
)
# A regex to split the DN, taking escaped commas into account
$DNRegex = '(?<![\]),'
# Array to hold each component
[String[]]$MissingOUs = @()
# We'll need to traverse the path, level by level, let's figure out the number of possible levels
$Depth = ($DN -split $DNRegex).Count
# Step through each possible parent OU
for($i = 1;$i -le $Depth;$i++)
{
$NextOU = ($DN -split $DNRegex,$i)[-1]
if($NextOU.IndexOf("OU=") -ne 0 -or [ADSI]::Exists("LDAP://$NextOU"))
{
break
}
else
{
# OU does not exist, remember this for later
$MissingOUs += $NextOU
}
}
# Reverse the order of missing OUs, we want to create the top-most needed level first
[array]::Reverse($MissingOUs)
# Prepare common parameters to be passed to New-ADOrganizationalUnit
$PSBoundParameters.Remove('DN')
# Now create the missing part of the tree, including the desired OU
foreach($OU in $MissingOUs)
{
$newOUName = (($OU -split $DNRegex,2)[0] -split "=")[1]
$newOUPath = ($OU -split $DNRegex,2)[1]
New-ADOrganizationalUnit -Name $newOUName -Path $newOUPath @PSBoundParameters
}
}
Uso usando o WHATIF
# The desired resulting OU DN
$DN = "OU=Helpdesk,OU=IT Dept,OU=Users,DC=local,DC=contoso"
New-OrganizationalUnitFromDN $DN -WhatIf
Sem WHATIF
# The desired resulting OU DN
$DN = "OU=Helpdesk,OU=IT Dept,OU=Users,DC=local,DC=contoso"
New-OrganizationalUnitFromDN $DN
Ele será quebrado se houver contêineres não-OU não existentes no caminho.