【问题标题】:Update Active Directory (On-Prem) User Attribute via Powershell通过 Powershell 更新 Active Directory(本地)用户属性
【发布时间】:2026-01-23 01:05:02
【问题描述】:

我试图不打扰你们所有人,但我不知所措。我先说一下,我对 PS 还是比较陌生,所以对于任何无知,我深表歉意。

需要:将 AD 中所有用户的用户属性(准确地说是 extensionAttribute1)更新为“First.Last”(或者更确切地说,“givenName.Surname”)。

问题:当我尝试运行下面的 Powershell 时(我尝试了 2 种不同的更新方法,因此被注释掉的部分),我得到了下面的输出。

Import-Module ActiveDirectory

Get-ADUser -Filter * -SearchBase 'ou=Users,ou=Test,dc=Sample,dc=Com' | 
    Select SamAccountName | 
    Export-Csv -Path 'c:\Scripts\AllUsersSamaccountname.CSV' -NoTypeInformation

$file="c:\Scripts\AllUsersSamaccountname.CSV"
(gc $file | select -Skip 1) | sc $file


$Users = Import-Csv -Path "c:\Scripts\AllUsersSamaccountname.CSV" -Header "AccountName"
     foreach($User in $Users){ 
     $ADUser = Get-ADUser -Identity $User.AccountName -Properties extensionAttribute1 
     $ADUserG = Get-ADUser -Identity $User.AccountName -Properties givenName 
     $ADUserS = Get-ADUser -Identity $User.AccountName -Properties Surname
     #$ADUser.extensionAttribute1 = [Array]$ADUserG + '.' + $ADUserS
     Set-ADUser -Instance $ADUser -replace @{extensionAttribute1=([Array]$ADUserG + '.' + $ADUserS)}
     
}

Get-ADUser -Filter * -SearchBase 'ou=Users,ou=Test,dc=George,dc=Com' | 
    Select extensionAttribute1 | 
    Export-Csv -Path 'c:\Scripts\new-AllUserinfo6.CSV' -NoTypeInformation
Set-ADUser -Instance $ADUser -replace @{extensionAttribute1=([Array]$ADUserG + '.' + $ADUserS)的

输出

Set-ADUser : Cannot validate argument on parameter 'Replace'. All values in the argument collection should be of 
the same type.
At line:17 char:44
+ ... er -replace @{extensionAttribute1=([Array]$ADUserG + '.' + $ADUserS)} ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidData: (:) [Set-ADUser], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.ActiveDirectory.Management.Commands.Set 
   ADUser
#$ADUser.extensionAttribute1 = [Array]$ADUserG + '.' 的

输出 + $ADUserS

Exception setting "extensionAttribute1": "The adapter cannot set the value of property "extensionAttribute1"."
At line:16 char:6
+      $ADUser.extensionAttribute1 = [Array]$ADUserG + '.' + $ADUserS
+      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], SetValueInvocationException
    + FullyQualifiedErrorId : CatchFromBaseAdapterSetValue
 

任何帮助或指导将不胜感激......

【问题讨论】:

    标签: powershell active-directory


    【解决方案1】:

    您正在将 givenName 转换为数组。这很可能导致整个表达式返回一个数组,这对于 extensionAttribute1 是不可接受的。

    我没有对此进行测试,但将循环重写为以下内容应该可以:

    foreach($User in $Users)
    {
        $ADUser = Get-ADUser -Identity $User.AccountName -Properties extensionAttribute1 
        $ADUserG = Get-ADUser -Identity $User.AccountName -Properties givenName 
        $ADUserS = Get-ADUser -Identity $User.AccountName -Properties Surname
    
        $extensionAttribute1 = ($ADUserG.givenName + '.' + $ADUserS.Surname)
        $ADUser.extensionAttribute1 = $extensionAttribute1
        Set-ADUser -Instance $ADUser
    }
    

    注意:您必须引用 givenName 和 Surname 的属性才能将它们连接为字符串。否则,您尝试将 2 个用户对象添加到一起,会出现错误。

    其他信息:

    如果是我,我会写得更简洁。但是,考虑到您对 PowerShell 比较陌生,我只提出一项建议。在循环中,您不需要多次获取用户帐户,如下所示应该可以工作并且速度会更快一些。

        Import-Module ActiveDirectory
    
    Get-ADUser -Filter * -SearchBase 'ou=Users,ou=Test,dc=Sample,dc=Com' | 
    Select-Object SamAccountName | 
    Export-Csv -Path 'c:\Scripts\AllUsersSamaccountname.CSV' -NoTypeInformation
    
    $file="c:\Scripts\AllUsersSamaccountname.CSV"
    (Get-Content $file | Select-Object -Skip 1) | Set-Content $file
    
    $Users = (Import-Csv -Path "c:\Scripts\AllUsersSamaccountname.CSV" -Header "AccountName")
    
    foreach($User in $Users)
    {
        $ADUser = Get-ADUser -Identity $User.AccountName -Properties 'extensionAttribute1','givenName','Surname'
    
        $extensionAttribute1 = ($ADUser.givenName + '.' + $ADUser.Surname)
        $ADUser.extensionAttribute1 = $extensionAttribute1 
        Set-ADUser -Instance $ADUser 
    }
    
    Get-ADUser -Filter * -SearchBase 'ou=Users,ou=Test,dc=George,dc=Com' | 
    Select-Object extensionAttribute1 | 
    Export-Csv -Path 'c:\Scripts\new-AllUserinfo6.CSV' -NoTypeInformation
    

    【讨论】:

    • 嗨史蒂文,首先感谢您提供的信息。我尝试了您发送的第二个块并现在收到此错误消息。 Set-ADUser :无法使用指定的命名参数解析参数集。在 line:18 char:5 + Set-ADUser -Instance $ADUser -Replace @{extensionAttribute1 = $e ... + ~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidArgument: (:) [Set-ADUser], ParameterBindingException + FullyQualifiedErrorId : AmbiguousParameterSet,Microsoft.ActiveDirectory.Management.Commands.SetADUser
    • 值得注意的是,您评论中的第一部分会返回此错误消息。方法调用失败,因为 [Microsoft.ActiveDirectory.Management.ADUser] 不包含名为“op_Addition”的方法。在 line:19 char:5 + $extensionAttribute1 = ($ADUserG + '.' + $ADUserS) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (op_Addition:String) [], RuntimeException + FullyQualifiedErrorId : MethodNotFound
    • 这就是为什么我认为我必须使用 [Array]..?
    • 第一个错误是因为我们没有引用子属性,所以它试图将 20 个用户对象添加在一起。我们真正想要的是添加给定的 & surName 属性,它们是简单的字符串。这在两个示例中都已得到纠正。
    • 第二个错误表示参数不兼容。 -Instance 不能与 -Replace 一起使用。它们位于不同的参数集中...我使用正确的用法更新了示例。