Erro ao adicionar usuários em massa no AD com o script do PowerShell

1

Estou tentando adicionar usuários ao AD usando um script do PowerShell que extrai informações de um arquivo csv. Eu tenho isso funcionando principalmente, em que os usuários são criados e eles parecem funcionar. No entanto, estou recebendo algumas exceções quando o script é executado e preciso de ajuda para depurá-lo e descobrir onde ele está falhando. O script, o snippet csv e os erros seguem. Observe também que parece que os erros não ocorrem na criação de todos os usuários; Eu só tenho algumas iterações dos erros.

Existe uma maneira de eu conseguir isso em uma declaração if / then para imprimir o que está acontecendo no ponto de erro, ou para ver qual objeto AD está falhando e por quê? Ou alguma outra maneira de depurar isso?

$objOU=[ADSI]“LDAP://OU=People,DC=testdomain,DC=com”
$dataSource=import-csv “test users2.csv”
foreach($dataRecord in $datasource) {
    $cn=$dataRecord.FirstName + ” ” + $dataRecord.LastName
    $sAMAccountName=$dataRecord.UserName
    $givenName=$dataRecord.FirstName
    $sn=$dataRecord.LastName
    $sAMAccountName=$sAMAccountName.ToLower()
    $displayName=$givenName + " " + $sn
    $userPrincipalName=$sAMAccountName + “@testdomain.com”
    $sISID=$dataRecord.Sisid
    $objUser=$objOU.Create(“user”,”CN=”+$cn)
    $objUser.Put(“sAMAccountName”,$sAMAccountName)
    $objUser.Put(“userPrincipalName”,$userPrincipalName)
    $objUser.Put(“displayName”,$displayName)
    $objUser.Put(“givenName”,$givenName)
    $objUser.Put(“sn”,$sn)
    $objUser.Put("description",$dataRecord.Gender + ", " + "Class of " + $dataRecord.Graduation + ", " + $sISID)
    $objUser.SetInfo()
    $objUser.SetPassword($dataRecord.Password)
    $objUser.psbase.InvokeSet(“AccountDisabled”,$false)
    $objUser.SetInfo()
   }
USERNAME,PASSWORD,SISID,FIRSTNAME,LASTNAME,GRADUATION,GENDER
usera,dfqt4d,1111110681,Akeem,xxxxx,2016,M
userb,nw97ph,1111166963,Ariel,xxxxx,2015,F
Exception calling "SetInfo" with "0" argument(s): "A device attached to the system is not functioning. " At C:\For Sharing\add users script.ps1:19 char:17
    + $objUser.SetInfo <<<< ()
        + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
        + FullyQualifiedErrorId : CatchFromBaseAdapterMethodInvokeTI   

Exception calling "SetPassword" with "1" argument(s): "There is no such object on the server. " At C:\For Sharing\add users script.ps1:20 char:21
    + $objUser.SetPassword <<<< ($dataRecord.Password)
        + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
        + FullyQualifiedErrorId : CatchFromBaseAdapterMethodInvokeTI   

Exception calling "InvokeSet" with "2" argument(s): "The directory property cannot be found in the cache. " At C:\For Sharing\add users script.ps1:21 char:26
    + $objUser.psbase.InvokeSet <<<< (“AccountDisabled”,$false)
        + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
        + FullyQualifiedErrorId : DotNetMethodTargetInvocation
    
por Holocryptic 13.12.2010 / 19:11

1 resposta

3

O PowerShell 2.0 oferece suporte a blocos try / catch , para que você possa capturar e manipular quaisquer exceções.

Você pode colocar um Write-Host no seu bloco catch para fazer o eco no console, qual usuário está causando o problema no script.

Seu script, por exemplo, ficaria assim.

$objOU=[ADSI]“LDAP://OU=People,DC=testdomain,DC=com”
$dataSource=import-csv “test users2.csv”
foreach($dataRecord in $datasource)
{
    try
    {
        $cn=$dataRecord.FirstName + ” ” + $dataRecord.LastName
        $sAMAccountName=$dataRecord.UserName
        $givenName=$dataRecord.FirstName
        $sn=$dataRecord.LastName
        $sAMAccountName=$sAMAccountName.ToLower()
        $displayName=$givenName + " " + $sn
        $userPrincipalName=$sAMAccountName + “@testdomain.com”
        $sISID=$dataRecord.Sisid
        $objUser=$objOU.Create(“user”,”CN=”+$cn)
        $objUser.Put(“sAMAccountName”,$sAMAccountName)
        $objUser.Put(“userPrincipalName”,$userPrincipalName)
        $objUser.Put(“displayName”,$displayName)
        $objUser.Put(“givenName”,$givenName)
        $objUser.Put(“sn”,$sn)
        $objUser.Put("description",$dataRecord.Gender + ", " + "Class of " + $dataRecord.Graduation + ", " + $sISID)
        $objUser.SetInfo()
        $objUser.SetPassword($dataRecord.Password)
        $objUser.psbase.InvokeSet(“AccountDisabled”,$false)
        $objUser.SetInfo()
    }
    catch
    {
        Write-Host "*** Exception Handler ***"
        Write-Host "Problem username: " $dataRecord.UserName
        Write-Host "*************************"
    }
}

Por motivos que o script pode falhar, o sAMAccountName é exclusivo (por exemplo, John Smith e James Smith sendo ambos jsmith) e o sAMAccountName contém caracteres especiais (símbolos, letras com acentos etc.)? Há algumas razões pelas quais posso pensar que isso pode causar uma exceção.

    
por 14.12.2010 / 00:50