Я пытаюсь добавить пользователей в AD с помощью сценария PowerShell, который извлекает информацию из файла csv. У меня это в основном работает, потому что пользователи создаются, и они, кажется, работают. Однако при запуске сценария возникают исключения, и мне нужна помощь, чтобы отладить его и выяснить, где он дает сбой. Далее следуют сценарий, фрагмент csv и ошибки. Также обратите внимание, что похоже, что ошибки возникают не при каждом создании пользователя; У меня всего несколько итераций ошибок.
Есть ли способ обернуть это в оператор if / then, чтобы распечатать, что происходит в точке ошибки, или узнать, какой объект AD не работает и почему? Или какой-то другой способ отладить это?
$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 поддерживает попробуй поймать блоки, так что вы можете перехватывать и обрабатывать любые исключения.
Вы можете поставить Write-Host
в вашем блоке catch, чтобы отобразить на консоли, какой пользователь вызывает проблему в вашем скрипте.
Ваш сценарий, например, будет выглядеть так.
$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 какие-либо специальные символы (символы, буквы с диакритическими знаками и т. Д.)? Есть несколько причин, по которым я могу придумать, почему это может вызвать исключение.