Active-Directory
如何在 Powershell 上遞歸創建組織單位?
我正在編寫一個 Powershell 腳本來將所有公司使用者從 CSV 文件填充到 Active Directory。
該腳本使用 Powershell 命令
New-ADUser
,對於每個使用者,它應該知道添加它們的路徑在哪裡,例如:"OU=IT Dept,OU=Users,DC=local,DC=contoso"
問題是:這個 Active Directory 還沒有任何使用者,所以沒有創建組織單位,每當我執行腳本時,如果路徑不存在,則不會創建使用者。
我已經查找了創建組織單位的命令,例如
New-ADOrganizationalUnit
ordsadd
,但是它們不支持遞歸創建,例如"OU=Helpdesk,OU=IT Dept,OU=Users,DC=local,DC=contoso"
如果
"OU=IT Dept,OU=Users,DC=local,DC=contoso"
還不存在。
有沒有辦法使用New-ADOrganizationalUnit做到這一點?
謝謝
正如Mike在評論中所提到的,您需要遍歷樹中的每個級別並測試 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
沒有 WHATIF
# The desired resulting OU DN $DN = "OU=Helpdesk,OU=IT Dept,OU=Users,DC=local,DC=contoso" New-OrganizationalUnitFromDN $DN
如果路徑中有不存在的非 OU 容器,它將中斷。