无法使用Set-ADUser更新AD字段

时间:2016-02-01 20:11:25

标签: csv powershell active-directory

我正在尝试使用CSV文件和PowerShell脚本更新ActiveDirectory信息。

foreach ($user in $users) {            
    Get-ADUser -Identity $user.SamAccountName -Properties *         
}

返回CSV文件中用户的值,我可以在ActiveDirectory中看到属性名称和值。

这段代码:

$users = Import-Csv -Path C:\ADTest\DirectoryExport2.csv                       
foreach ($user in $users) {            
    #Search and Update existing attributes            
    Get-ADUser -Identity $user.samaccountname |
        Set-ADUser -Replace @{GivenName=$user.givenName}

允许我用我的CSV中的值替换ActiveDirectory中的GivenName值。我还需要更新8个值,当我尝试将这些值添加到代码中时,它不起作用。

这是我尝试过的两次代码尝试:

$users = Import-Csv -Path C:\ADTest\DirectoryExport2.csv                      
foreach ($user in $users) {            
    #Search and Update existing attributes            
    Get-ADUser -Identity $user.samaccountname |
        Set-ADUser -Replace @{GivenName=$user.givenName}
    Get-ADUser -Identity $user.samaccountname |
        Set-ADUser -Replace @{Surname=$user.sn}
}

我也试过这个:

$users = Import-Csv -Path C:\ADTest\DirectoryExport2.csv                      
foreach ($user in $users) {            
    #Search and Update existing attributes            
    Get-ADUser -Identity $user.samaccountname |
        Set-ADUser -Replace @{GivenName=$user.givenName;Surname=$user.sn}
}

但是我为这两次尝试都收到了同样的错误消息:

这是错误讯息:

Set-ADUser : The specified directory service attribute or value does not exist
Parameter name: Surname
At line:5 char:55
+ Get-ADUser -Identity $user.samaccountname | Set-ADUser <<<<  -replace @{Surname=$user.sn}
    + CategoryInfo          : InvalidArgument: (CN=Test1User1,O...-sheriff,DC=net:ADUser) [Set-ADUser], ArgumentException
    + FullyQualifiedErrorId : The specified directory service attribute or value does not exist
Parameter name: Surname,Microsoft.ActiveDirectory.Management.Commands.SetADUser

参数名称Surname确实存在于ActiveDirectory中,因为我在运行上面的第一个代码时可以看到它是该查询的结果。你可以看到它们是空白的。

State                              : 
StreetAddress                      : 
Surname                            : 
Title                              :

有谁能解释我在这里做错了什么?

2 个答案:

答案 0 :(得分:2)

TechNet for Set-ADUser在此处有部分答案。误解是认为PowerShell和Active Directory中的活动目录cmdlet的用户属性之间存在直接关联。

查看Set-ADUser的参数列表。您显示的示例已涵盖,您无需使用-ReplaceSet-ADUser也有一个-Identity参数,因此您可以跳过一个cmdlet。

Set-ADUser -Identity $user.samaccountname -Surname $user.sn -GivenName $user.givenName

由于您的工作基于csv,因此您应该注意可能不再存在的用户或拼写错误。

当其中一个内置参数没有你想要的属性时,-Replace会派上用场。您需要了解您输入的哈希表使用AD的LDAP属性。

如果查看MSDN for Surname,您会看到Ldap-Display-Name为sn。这就是为什么你得到一个错误,因为AD中不存在姓氏

答案 1 :(得分:0)

感谢您的帮助,非常好。这就是我最终的结局代码。我不得不为AD中更新的每个项重复此代码。还不得不留下-Surname -sa扔错了。再次谢谢你

IF([string]::IsNullOrEmpty($user.sn))
{        
    Set-ADUser -Identity $user.samaccountname -Surname $null

}else{

    Set-ADUser -Identity $user.samaccountname -Surname $user.sn
}