尝试根据当前显示名称一次重命名多个帐户类型

Trying to rename several account types at once based on current displayName

今天早上,一些很棒的人帮我制作了一个脚本,可以根据用户帐户的 displayName 将用户帐户移动到某个 OU。我测试过并且有效。我拆解了脚本以制作另一个脚本,该脚本将根据相同的标准重命名相同的帐户。我遇到了几个错误,但基本上都归结为 "I am having an identity crisis!"。我似乎无法弄清楚我需要输入什么作为 $Identity。这是我拥有的:

Import-Module ActiveDirectory

$Renames = @(
  @{
    Filter = 'DisplayName -like "*Supply*"'
    NewName = "Supplies"
  },
  @{
    Filter = 'DisplayName -like "*Accountant*"'
    NewName = "Accounting"
  }
) | ForEach-Object {New-Object -TypeName PSCustomObject -Property $_}

$OriginOU = "OU=Test,OU=Standard Users,OU=Domain Users,DC=com"

foreach ($Rename in $Renames) {
  Get-ADUser -SearchBase $OriginOU -Filter $Rename.Filter -Properties displayName |
    Where-Object {($_.Enabled -eq 'True') -and ($_.DistinguishedName -notlike '*DontTouch*')} |
    %{Set-ADUser $_ -DisplayName {$_.DisplayName -replace '(.EPSILON ).+',"`$Rename.NewName"}}
}

如果 Set-ADUser 直接从管道读取,则不能使用当前对象变量 ($_)。由于 Set-ADUser 显然不能很好地处理脚本块参数,因此您必须将语句放入循环中:

... | % { Set-ADUser $_ -DisplayName ($_.DisplayName -replace '(.EPSILON ).+',"`$($Rename.NewName)") }

请注意,如果要在字符串中扩展对象属性,则必须将 $Rename.NewName 放入子表达式 ($()) 中,否则整个对象 $Rename 将被字符串化并且字符串“.NewName”将附加到它。