使用PowerShell脚本在AD中添加批量用户时出错

我正在尝试使用从csv文件中提取信息的PowerShell脚本将用户添加到AD中。 我主要工作,用户创build,他们似乎工作。 不过,我在脚本运行时遇到了一些exception,我需要一些帮助来debugging它,并找出它失败的地方。 脚本,csv代码片段和错误如下。 还要注意,看起来每个用户创build都不会发生错误。 我只有几个迭代的错误。

有没有一种方法可以将它包含在if / then语句中,以打印错误点处发生的事情,或者查看AD对象失败的原因,以及为什么? 或者其他方式来debugging呢?

$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 

PowerShell 2.0支持try / catch块,所以你可以捕获和处理任何exception。

您可以在您的catch块中放置一个Write-Host来回显控制台,哪个用户正在导致您的脚本出现问题。

你的脚本例如看起来像这样。

 $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 "*************************" } } 

至于脚本可能会崩溃的原因,是唯一的sAMAccountName(例如约翰·史密斯和詹姆斯·史密斯都是jsmith)和sAMAccountName是否包含任何特殊字符(符号,带有口音的字母等)? 有几个原因可以让我想起为什么它可能会导致exception。