批量更新带有员工ID作为匹配键的AD属性

我有一个CSV文件,我需要批量更新AD。 该文件具有一个employeeID,它将与AD中的employeeID字段匹配。 到目前为止,如果只有一行信息,我就可以使用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 

你遇到了什么错误?
它是在一些用户上工作,在别人上失败?
你确定所有ALREDY员工都有员工ID吗?
如果有没有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时,当var是空白string(如“”)时,可以说“-clear department”或“-department $ null”,而不是“-department $ var”。 为什么一个允许,另一个不允许? 不知道,问一下微软的这个头衔。

您可以对这些值进行修改,并用空值代替空白。 为了有效地做到这一点,我使用了当前对象($ _)的属性,使它们成为所有新的stringvariables。 除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:
什么是确切的错误?
同样,很高兴看到你在post中编辑的完整代码mod。
添加工作线到我的代码示例…
如果我猜对了,你不需要/不能使用$ _。license的引号。 当你这样做的时候,整个对象首先被转换成一个string,然后它查找一个名为“license”的string属性不再存在,因为它现在是string,不再是一个对象。
做一些研究PowerShell对象,这些不是你可能习惯的扁平variables…
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

首先,用这样的所有数据创build一个对象:

 $Path = "location of csv" $Users = Get-Content -Path $Path | ConvertFrom-CSV 

然后就像这样迭代数据行:

 $Users | %{ #Set ad user stuff using $_.Attribute }