通过 Powershell 更新 Active Directory (On-Prem) 用户属性

Update Active Directory (On-Prem) User Attribute via Powershell

我尽量不打扰大家,但我不知所措。首先,我对 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

Output for 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

Output for #$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
 

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

您正在将 givenName 转换为数组。这很可能导致整个表达式 return 一个数组,这对于 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