![如何在 Powershell 上递归创建组织单位?](https://linux22.com/image/640390/%E5%A6%82%E4%BD%95%E5%9C%A8%20Powershell%20%E4%B8%8A%E9%80%92%E5%BD%92%E5%88%9B%E5%BB%BA%E7%BB%84%E7%BB%87%E5%8D%95%E4%BD%8D%EF%BC%9F.png)
我正在编写一个 Powershell 脚本,以便将所有公司用户从 CSV 文件填充到 Active Directory 中。
该脚本使用 Powershell 命令New-ADUser
,它应该知道每个用户的添加路径在哪里,例如:
"OU=IT Dept,OU=Users,DC=local,DC=contoso"
问题是:这个 Active Directory 还没有任何用户,因此没有创建组织单位,并且每当我运行脚本时,如果路径不存在,就不会创建用户。
我已经查找了创建组织单位的命令,例如New-ADOrganizationalUnit
或dsadd
,但它们不支持递归创建,例如
"OU=Helpdesk,OU=IT Dept,OU=Users,DC=local,DC=contoso"
如果
"OU=IT Dept,OU=Users,DC=local,DC=contoso"
尚不存在。
有没有办法做到这一点新-ADOrganizationalUnit?
谢谢
答案1
正如评论中提到的麦克风,您需要遍历树中的每个级别并测试 OU 祖先是否存在,然后从最顶层向下创建不存在的 OU 祖先。
只要New-ADOrganisationalUnit
没有 -Recurse 参数,这是我能想到的最优雅的方式:
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
}
}
使用 WHATIF
# The desired resulting OU DN
$DN = "OU=Helpdesk,OU=IT Dept,OU=Users,DC=local,DC=contoso"
New-OrganizationalUnitFromDN $DN -WhatIf
没有“如果”
# The desired resulting OU DN
$DN = "OU=Helpdesk,OU=IT Dept,OU=Users,DC=local,DC=contoso"
New-OrganizationalUnitFromDN $DN
如果路径中不存在非 OU 容器,它将会中断。
答案2
的输出$NextOU.IndexOf("OU=")
区分大小写,对于所有小写ou=
尝试将返回 -1:$NextOU.IndexOf("OU=",[StringComparison]"CurrentCultureIgnoreCase")