У меня есть файл CSV, с помощью которого мне нужно массово обновить AD. В файле есть идентификатор сотрудника, который соответствует полю идентификатора сотрудника в 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
Сначала создайте объект со всеми такими данными:
$Path = "location of csv"
$Users = Get-Content -Path $Path | ConvertFrom-CSV
Затем просто перебирайте строки данных следующим образом:
$Users | %{
#Set ad user stuff using $_.Attribute
}
Какую ошибку вы получаете?
Работает ли он у одних пользователей, а у других не работает?
Вы уверены, что у всех сотрудников УЖЕ есть удостоверения личности?
Если есть пользователи без 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
ОБНОВЛЕНИЕ1:
Ошибка возникает из-за пустых значений.
При использовании Set-Aduser вы можете сказать «-департамент $ null», но не «-отдел $ 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}
}
ОБНОВЛЕНИЕ2:
В чем была точная ошибка?
Опять же, приятно видеть полный код мода, который вы отредактировали в этом посте.
В мой пример кода добавлена рабочая строка ...
Если я правильно угадала, вам не нужны / нельзя использовать кавычки около $ _. 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