Set-ADUser не обрабатывает пустые или нулевые переменные - PullRequest
0 голосов
/ 06 июня 2019

Я новичок в PS и AD, я пишу скрипт, который проходит через csv и обновляет нашу AD. У меня есть несколько проблем: когда поле заполнено, команда PS AD работает нормально, если переменная равна нулю или пуста, команда PS завершается ошибкой. Мне трудно поверить, что AD не может обрабатывать нулевые значения, поэтому я не знаю, делаю ли я что-то неправильно.

Я пытался выполнить отдельные команды для каждой, чтобы определить, является ли это нулем, вызывающим проблему, и я могу видеть, что это происходит.

$datetime= get-date -UFormat "%Y-%m-%d_%H-%M-%S"
Import-Csv D:\adupdate.csv | ForEach-Object {
$hdate = $_."hiredate" -as [datetime] 

Set-ADUser $_.UserID -DisplayName $_.DisplayName -Initials $_.Middle -Manager $_.Manager -Surname $_.LastName -givenname $_.FirstName -Office $_.Office -Department $_.Department -officeNumber $_.TeleNumber -MobilePhone $_.Mobile -Title $_.JobTitle -Company $_.Company -replace @{employeeType=$_.EmployeeType;employeeID=$_.Badge;employeeNumber=$_.EmployeeNumber;extensionAttribute3=$_.Subdepartment;ipPhone=$_.ipPhone}
Set-ADUser $_.UserID -replace @{hireDate=$hdate}
}

Ошибка:

+ CategoryInfo          : InvalidOperation: (XXX:ADUser) [Set-ADUser], ADInvalidOperationException
    + FullyQualifiedErrorId : ActiveDirectoryServer:0,Microsoft.ActiveDirectory.Management.Commands.SetADUser

Итак, я изменил это, но кажется неэффективным проверять каждую переменную из csv, чтобы проверить, является ли она нулевой или пустой:

if(-not ([string]::IsNullOrEmpty($_.employeetype))){Set-ADUser $_.userid -Replace @{'employeeType'=$_.employeetype}}
    else {Set-ADUser $_.userid - -Replace @{'employeeType'=' '}}
    if(-not ([string]::IsNullOrEmpty($_.badgenumber))) {Set-ADUser $_.userid -Replace @{'employeeID'=$_.badgenumber}}
    else {Set-ADUser $_.userid -Replace @{'employeeID'= ' '}}
    if(-not ([string]::IsNullOrEmpty($_.eecode))) {Set-ADUser $_.userid -Replace @{'employeeNumber'=$_.eecode}}
    else {Set-ADUser $_.userid -Replace @{'employeeNumber'= ' '}}
    if(-not ([string]::IsNullOrEmpty($_.subdepartment))) {Set-ADUser $_.userid -Replace @{'extensionAttribute3'=$_.subdepartment}}
    else{Set-ADUser $_.userid -Replace @{'extensionAttribute3'=' '}}
    if(-not ([string]::IsNullOrEmpty($_.ipphone))) {Set-ADUser $_.userid -Replace @{'ipPhone'=$_.ipphone}}
    else{Set-ADUser $_.userid -Replace @{'ipPhone'=' '}}

1 Ответ

2 голосов
/ 06 июня 2019

Если вы не хотите выполнять проверку ошибок / исправности перед обновлением данных, вы можете сохранить данные -Replace в хэш-таблице. Затем удалите пустые / пустые пары ключ-значение. После очистки вы можете передать переменную хеш-таблицы параметру -Replace.

$hash = @{employeeType=$_.EmployeeType;employeeID=$_.Badge;employeeNumber=$_.EmployeeNumber;extensionAttribute3=$_.Subdepartment;ipPhone=$_.ipPhone}
$keysToRemove = $hash.keys | Where-Object { 
    !$hash[$_] 
}
$keysToRemove | Foreach-Object { 
    $hash.remove($_) 
}

Set-ADUser $_.UserID -DisplayName $_.DisplayName -Initials $_.Middle -Manager $_.Manager -Surname $_.LastName -givenname $_.FirstName -Office $_.Office -Department $_.Department -officeNumber $_.TeleNumber -MobilePhone $_.Mobile -Title $_.JobTitle -Company $_.Company -Replace $hash

Иногда вы можете захотеть убрать данные, если они станут нулевыми. В прошлом я использовал Set-ADUser -Clear PropertyName, чтобы стереть эти значения. В этом случае вы можете использовать Set-ADUser -Clear $keysToRemove.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...