Active-Directory

如何在 Powershell 上遞歸創建組織單位?

  • September 16, 2021

我正在編寫一個 Powershell 腳本來將所有公司使用者從 CSV 文件填充到 Active Directory。

該腳本使用 Powershell 命令New-ADUser,對於每個使用者,它應該知道添加它們的路徑在哪裡,例如:

"OU=IT Dept,OU=Users,DC=local,DC=contoso"

問題是:這個 Active Directory 還沒有任何使用者,所以沒有創建組織單位,每當我執行腳本時,如果路徑不存在,則不會創建使用者。

我已經查找了創建組織單位的命令,例如New-ADOrganizationalUnitor dsadd,但是它們不支持遞歸創建,例如

"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 容器,它將中斷。

引用自:https://serverfault.com/questions/624279