У меня есть CSV-файл с пользовательскими данными и сценарий, использующий if/else, который использует Get-ADUser, чтобы определить, существует ли учетная запись уже. Если пользователь существует, скрипт обновляет пользователя. Если пользователь не существует, я получаю сообщение об ошибке «Не удается найти объект с идентификатором:« bob.roberts ». Кажется, что пропускает остальную часть сценария. Вот обработанная версия скрипта, который я использую:

    $Users = Import-Csv -Path "\\path\to\user.csv"

foreach ($User in $Users)
{
    $Displayname = $User.Lastname + ", " + $User.Firstname
    $UPN = $User.SAM + "@" + $User.Domain

    if (Get-ADUser $User.SAM)
    {
       Set-ADUser -Identity $User.SAM -Enabled: $true -Description $User.Description -Title $User.Title -Company $User.Company -Office $User.Office -Department $User.Department -Email $User.Email -StreetAddress $User.Street -City $User.City -State $User.Province -PostalCode $User.PostalCode -Country CA -OfficePhone $User.Telephone -Fax $User.Fax
       Move-ADObject -TargetPath $($User.OU)
    }
    else
    {
       New-ADUser -Name $Displayname -Enabled: $true -Path $User.OU -DisplayName $Displayname -SamAccountName $User.SAM -UserPrincipalName $UPN -GivenName $User.Firstname -Surname $User.Lastname -Description $User.Description -Title $User.Title -Company $User.Company -Department $User.Department -Email $User.Email -StreetAddress $User.Street -City $User.City -State $User.Province -PostalCode $User.PostalCode -OfficePhone $User.Telephone -Fax $User.Fax -AccountPassword (ConvertTo-SecureString $User.Password -AsPlainText -Force) -ChangePasswordAtLogon $false -PasswordNeverExpires $true -OtherAttributes @{'PhysicalDeliveryOfficeName'=$User.Office;'Pager'=$User.Pager;c="CA";co="Canada";countrycode=124}
    }
    Start-Sleep -s 2
    if ($User.ADGroup -ne "null")
    {
       Add-ADGroupMember -Identity $User.ADGroup -Members $user.SAM
    }
}

Я знаю, что что-то упускаю (вероятно, что-то очевидное), но что?

1 ответ1

1

Вместо if / else вы должны использовать try / catch

Когда вы запускаете команду, которая вызывает ошибку, команда будет делать то, что называется выбрасыванием исключения. Используя блок try/catch, он позволяет вам корректно обработать это исключение и выполнить действия, чтобы решить проблему, которая в противном случае может привести к сбою вашего скрипта.

Мне нравится эта цитата из https://www.reddit.com/r/PowerShell/comments/63n6ij/ifelse_versus_trycatchfinally/

Если вы заключите команду в try / catch и добавите -ErrorAction Stop в Get-ADUser код остановится и перейдет в блок catch, если Get-ADUser выдает ошибку. В противном случае он продолжит выполнение блока try . вы также не получите сообщение об ошибке таким образом, если пользователь AD не найден.

$Users = Import-Csv -Path "\\path\to\user.csv"

foreach ($User in $Users)
{
    $Displayname = $User.Lastname + ", " + $User.Firstname
    $UPN = $User.SAM + "@" + $User.Domain

    Try {
        Get-ADUser $User.SAM -ErrorAction Stop
        Set-ADUser -Identity $User.SAM -Enabled: $true -Description $User.Description -Title $User.Title -Company $User.Company -Office $User.Office -Department $User.Department -Email $User.Email -StreetAddress $User.Street -City $User.City -State $User.Province -PostalCode $User.PostalCode -Country CA -OfficePhone $User.Telephone -Fax $User.Fax
        Move-ADObject -TargetPath $($User.OU)
    }
    Catch {
        New-ADUser -Name $Displayname -Enabled: $true -Path $User.OU -DisplayName $Displayname -SamAccountName $User.SAM -UserPrincipalName $UPN -GivenName $User.Firstname -Surname $User.Lastname -Description $User.Description -Title $User.Title -Company $User.Company -Department $User.Department -Email $User.Email -StreetAddress $User.Street -City $User.City -State $User.Province -PostalCode $User.PostalCode -OfficePhone $User.Telephone -Fax $User.Fax -AccountPassword (ConvertTo-SecureString $User.Password -AsPlainText -Force) -ChangePasswordAtLogon $false -PasswordNeverExpires $true -OtherAttributes @{'PhysicalDeliveryOfficeName'=$User.Office;'Pager'=$User.Pager;c="CA";co="Canada";countrycode=124}
    }

    Start-Sleep -s 2

    if ($User.ADGroup -ne "null")
    {
       Add-ADGroupMember -Identity $User.ADGroup -Members $user.SAM
    }
}

Вы также можете сохранить результат Get-ADUser в переменной и проверить, является ли переменная пустой или нет с помощью if / else но я бы порекомендовал try / catch .

$ADUser = Get-ADUser $User.SAM -ErrorAction SilentlyContinue
if ($ADUser)
{
    Set-ADUser -Identity $User.SAM -Enabled: $true -Description $User.Description -Title $User.Title -Company $User.Company -Office $User.Office -Department $User.Department -Email $User.Email -StreetAddress $User.Street -City $User.City -State $User.Province -PostalCode $User.PostalCode -Country CA -OfficePhone $User.Telephone -Fax $User.Fax
    Move-ADObject -TargetPath $($User.OU)
}
else
{
    New-ADUser -Name $Displayname -Enabled: $true -Path $User.OU -DisplayName $Displayname -SamAccountName $User.SAM -UserPrincipalName $UPN -GivenName $User.Firstname -Surname $User.Lastname -Description $User.Description -Title $User.Title -Company $User.Company -Department $User.Department -Email $User.Email -StreetAddress $User.Street -City $User.City -State $User.Province -PostalCode $User.PostalCode -OfficePhone $User.Telephone -Fax $User.Fax -AccountPassword (ConvertTo-SecureString $User.Password -AsPlainText -Force) -ChangePasswordAtLogon $false -PasswordNeverExpires $true -OtherAttributes @{'PhysicalDeliveryOfficeName'=$User.Office;'Pager'=$User.Pager;c="CA";co="Canada";countrycode=124}
}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .