尝试根据当前displayName重命名多个帐户类型

时间:2015-06-18 18:32:37

标签: powershell active-directory rename identity

今天早上,一些很棒的人帮我创建了一个脚本,可以根据用户帐户的displayName将用户帐户移动到某个OU。我测试过,它有效。我蚕食脚本以制作另一个将根据相同标准重命名相同帐户的脚本。我经历过几次错误,但基本上归结为"我遇到了身份危机!"。我似乎无法确切地知道我需要输入$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 ).+',"`$1$Rename.NewName"}}
}

1 个答案:

答案 0 :(得分:2)

如果直接从管道中读取$_,则无法使用当前对象变量(Set-ADUser)。由于Set-ADUser显然不适合使用scriptblock参数,因此必须将语句置于循环中:

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

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