Массовое обновление атрибутов AD с идентификатором сотрудника в качестве совпадающего ключа
У меня есть файл CSV, который мне нужно для массового обновления AD. У файла есть employeeID, который будет соответствовать полю employeeID в AD. До сих пор я был в состоянии успешно обновить пользователя с помощью файла CSV, если есть только одна строка информации. Какие изменения мне нужно будет внести в мой скрипт, чтобы можно было обновлять множество пользователей / строк?
$Path = "C:\import\users-test.csv "
$users = Get-Content –Path $Path | ConvertFrom-CSV
$users | foreach {
$_.psobject.properties | foreach { if ($_.value -eq "") { $_.value = $null }}
$eid = $_.empID
$user = Get-ADUser -Filter {employeeID -eq $eid}
Set-ADUser $user.samaccountname -title $_.Title –department $_.department –description $_.Description –office $_.Office –streetAddress $_.Street –city $_.City –postalCode $_.Zip –state $_.State –OfficePhone $_.Telephone –Country $_.Country –add @{extensionattribute11=$_.License}
}
РЕДАКТИРОВАТЬ: Обновлен код на основе обратной связи. все еще не работает.
Любая помощь будет оценена. Это будет то, что будет выполняться на регулярной основе.
Спасибо,
Джим
ОБНОВЛЕНИЕ: ошибка, которую я получаю, - это
Set-ADUser : Cannot validate argument on parameter 'Add'. The argument is null or an element of the argument collection contains a null value. At line:7 char:250
+ ... _.Country –add @{extensionattribute11=$_.License}
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidData: (:) [Set-ADUser], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.ActiveDirectory.Management.Commands.SetADUser
2 ответа
Какую ошибку вы получаете?
Работает ли это на некоторых пользователях, а на других?
Вы уверены, что у всех сотрудников АЛРЕДЫ есть идентификаторы сотрудников?
Если есть пользователи без EID, приведенный ниже мод кода будет обрабатывать ошибку более изящно.
Возможно, вы захотите получить пользователя на основе samaccountname, которое является обязательным полем (EID не требуется)
$user = Get-ADUser -Filter {employeeID -eq $employeeID}
if ($user) {
Set-ADUser $User.samaccountname -title $Title –department $Dept –description $Desc –office $Office –streetAddress $Street –city $City –postalCode $Zip –state $State –OfficePhone $Phone –Country $Country
} else {
write-warning "No employee found with ID: $employeeID"
} # end if
} # end foreach top of script
Update1:
Ошибка исходит из пустых значений.
При использовании Set-Aduser вы можете сказать "-clear Department" или "-department $ null", но не "-department $ var", когда var представляет собой пустую строку типа "". Почему один разрешен, а другой не разрешен? Понятия не имею, спросите о головах у Microsoft.
Вы можете изменить значения, чтобы учесть это, и заменить пустое значение истинным нулем. Чтобы сделать это эффективно, я использовал свойства текущего объекта ($ _), чтобы сделать их новыми строковыми переменными. За исключением EID, текущее расширение объекта для этого не работало внутри -filter {}.
$Path = "C:\temp\userProps.csv"
$users = Get-Content –Path $Path | ConvertFrom-CSV
$users | foreach {
$_.psobject.properties | foreach { if ($_.value -eq "") { $_.value = $null }}
$eid = $_.employeeID
$user = Get-ADUser -Filter {employeeID -eq $eid}
Set-ADUser $user.samaccountname -title $_.Title –department $_.department –description $_.Description –office $_.Office –streetAddress $_.Street –city $_.City –postalCode $_.Zip –state $_.State –OfficePhone $_.telePhone –Country $_.Country
Set-ADUser $user.samaccountname -add @{extensionattribute11 = $_.License}
}
UPDATE2:
Какая была точная ошибка?
Опять же, приятно видеть полный код мода, который вы сделали отредактированным в посте.
Добавил рабочую строку в мой пример кода...
Если я правильно угадал, вам не нужно / нельзя использовать кавычки вокруг $_. Лицензии. Когда вы это делаете, весь объект сначала преобразуется в строку, а затем ищет свойство строки с именем "license", которого больше не существует, потому что он теперь является строкой и больше не является объектом.
Проведите некоторое исследование объектов powershell, это не плоские переменные, к которым вы можете привыкнуть...
http://powershell.com/cs/blogs/ebookv2/archive/2012/03/13/chapter-6-working-with-objects.aspx
http://powershell.com/cs/blogs/ebookv2/archive/2012/03/12/chapter-5-the-powershell-pipeline.aspx
Сначала создайте объект со всеми данными, подобными этим:
$Path = "location of csv"
$Users = Get-Content -Path $Path | ConvertFrom-CSV
Затем просто переберите строки данных следующим образом:
$Users | %{
#Set ad user stuff using $_.Attribute
}