以员工 ID 作为匹配键批量更新 AD 属性

以员工 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

答案1

您遇到了什么错误?
它对某些用户有效,对其他用户失败了吗?
您确定所有员工都已经拥有员工 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

更新1:

错误来自空白值。
使用 Set-Aduser 时,您可以说“-clear Department”或“-department $null”,但当 var 是像“”这样的空白字符串时,您不能说“-department $var”。为什么一个允许,而另一个不允许?不知道,请问微软的笨蛋。

您可以修改值以解决此问题,并将空白替换为真正的空值。为了有效地做到这一点,我使用了当前对象 ($_) 的属性,而不是将它们全部设为新的字符串变量。除了 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 周围使用引号。当您这样做时,整个对象首先转换为字符串,然后查找字符串的名为“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

答案2

首先,创建一个包含所有数据的对象,如下所示:

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

然后只需像这样迭代数据行:

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

相关内容