Como posso criar Unidades Organizacionais recursivamente no Powershell?

5

Estou escrevendo um script do Powershell para preencher todos os usuários da empresa para um Active Directory a partir de um arquivo CSV.

O script usa o comando Powershell New-ADUser e deve saber, para cada usuário, onde está o caminho para adicioná-los, por exemplo:

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

O problema é: este Active Directory ainda não tem nenhum usuário, então não há Unidades Organizacionais criadas, e sempre que eu executo o script, se o caminho não existe, o usuário não é criado.

Procurei um comando para criar Unidades organizacionais, como New-ADOrganizationalUnit ou dsadd , mas elas não suportam criações recursivas, como

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

se

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

ainda não existe.

Existe alguma maneira de fazer isso usando New-ADOrganizationalUnit ?

Obrigado

    
por Maurício Mota 27.08.2014 / 02:30

2 respostas

8

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.

    
por 27.08.2014 / 14:00
1

A saída de $NextOU.IndexOf("OU=") faz distinção entre maiúsculas e minúsculas e retornará -1 para todos os% min_de_co% tente: ou=

    
por 16.02.2017 / 23:46