web-dev-qa-db-ja.com

Powershellで再帰的に組織単位を作成するにはどうすればよいですか?

すべての企業ユーザーにCSVファイルからActive Directoryを入力するPowershellスクリプトを書いています。

スクリプトはPowershellコマンドNew-ADUserを使用します。すべてのユーザーについて、それらを追加するパスはどこにあるかを知っている必要があります。次に例を示します。

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

問題は、このActive Directoryにはまだユーザーがいないため、組織単位が作成されておらず、スクリプトを実行するたびにパスが存在しない場合、ユーザーは作成されません。

New-ADOrganizationalUnitdsaddなどの組織単位を作成するコマンドを探しましたが、次のような再帰的な作成はサポートされていません

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

もし

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

まだ存在しません。

New-ADOrganizationalUnitを使用してそれを行う方法はありますか?

ありがとう

5
Maurício Mota

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コンテナーがある場合、壊れます。

8

$NextOU.IndexOf("OU=")の出力では大文字と小文字が区別され、すべての小文字に対して-1が返されます_ou=_試してください:$NextOU.IndexOf("OU=",[StringComparison]"CurrentCultureIgnoreCase")

1
Jamie Thompson