Script para movimento do usuário com base na OU

1

Qualquer script que leia o atributo de departamento de usuários (sob uma UO e subU.As) e mova-os para UOs diferentes nomeadas como departamento (nome da estrutura da UO já criada, mesmo que seu departamento no atributo).

criamos ou e sub ou que têm nome diferente como atributo do departamento

Por favor, ajude se você tiver alguma coisa

Eu tentei abaixo do script .. ele está funcionando bem ... mas não para o sub OU ... você pode fazê-lo funcionar para o sub OU também (agora os usuários sob sub OU não estão pesquisando também não estão se movendo para sub OU mesmo sub OU é criada como nome do departamento) ....

# Moves User Accounts from the given Root OU into sub OUs by looking up the company Attribute of the User Object
# If the OU does not exist, it will be created (the regular expression filter is removing special characters)
Import-Module ActiveDirectory
$RootOU = "OU=Move,DC=testad,DC=com"
$LogFile=".\ADS_MoveUsersToOU.txt"
$strFilter = "(&(objectCategory=User))"
$objDomain = New-Object System.DirectoryServices.DirectoryEntry "LDAP://$RootOU"
$objSearcher = New-Object System.DirectoryServices.DirectorySearcher
$objSearcher.SearchRoot = $objDomain
$objSearcher.PageSize = 1000
$objSearcher.Filter = $strFilter
$objSearcher.SearchScope = "OneLevel"
$colProplist = "name", "department", "sAMAccountName", "cn"
Function Write-Log {
     [cmdletbinding()]
    Param(
     [Parameter(Position=0)]
     [ValidateNotNullOrEmpty()]
     [string]$Message
     )
     Write-Host $Message
     Write-Output "$(Get-Date) $Message" | Out-File -FilePath $LogFile -Append
} #end function
foreach ($i in $colPropList){
    $objSearcher.PropertiesToLoad.Add($i)
    }
$colResults = $objSearcher.FindAll()
foreach ($objResult in $colResults) {
    $objItem = $objResult.Properties;
    $strCompany = $objItem.department
    $strCN = $objItem.cn
    $strName = $objItem.name
    $strCompany = [System.Text.RegularExpressions.Regex]::Replace($strCompany,"[^1-9a-zA-Z_ ]","")
    Write-Log "INFO User found       : $strName"
    Write-Log "INFO Company         : $strCompany"
    Write-Log "INFO Canonical Name   : $strCN"
    Write-Log "INFO Distinguished Name : $strdistinguishedName"
    if (!$strCompany) {
        Write-Log "WARNING No Company Name found for User: $strName"
        }
    else {
        $fullOU = "OU=$strCompany,$RootOU"
        $OUExists = [ADSI]::Exists("LDAP://$fullOU")
        if ($OUExists) {
            Write-Log "INFO OU exists already:$fullOU"
            }
        else {
            Write-Log "INFO Creating new OU: $fullOU"
            $objDomain = [ADSI]"LDAP://$RootOU"
            $objOU = $objDomain.Create("OrganizationalUnit", "OU=$strCompany")
            try {
                $objOU.SetInfo()
                }
            catch {
                Write-Log "ERROR  Unable to set AD Info (Creating OU: $strCompany)"
                Write-Log "ERRMSG $($_.Exception.Message)"
                }
            }
            try {
                Move-ADObject -Identity "CN=$strCN,$RootOU" -TargetPath "OU=$strCompany,$RootOU"
                }
            catch {
                Write-Log "ERROR  Unable to move User:CN=$strCN,$RootOU"
                Write-Log "$($_.Exception.Message)"
                }
        }
    }
    
por Sanooj PK 04.05.2016 / 11:36

1 resposta

0

Você precisará fazer três alterações:

Primeiro, altere $searchScope de OneLevel para Subtree .

Em seguida, como agora você está pesquisando a subárvore, também será necessário colocar uma verificação no loop foreach para tentar a movimentação apenas se a localização atual do usuário não corresponder a $ fullOU. Caso contrário, ele tentará mover cada objeto para sua localização atual, o que causará erro e será ineficiente.

Por fim, você precisa alterar o argumento para Move-Adobject -Identity . Seu código atual pressupõe que cada objeto sempre exista na UO raiz. Quando você pesquisa subárvore, não pode. Use Move-Adobject -Identity $_.distinguishedName

    
por 16.05.2016 / 17:40