通过PowerShell替换ADSI中的legacyExchangeDN值

时间:2017-11-07 19:46:21

标签: powershell replace active-directory

我正在寻找纠正AD中的一个小问题,其中我提到的字段在值中有空格。

前:

legacyExchangeDN : /o=  First Organization/ou=Exchange Administrative Group (FYDIBOHF23SPDLT)/cn=Recipients/cn=6131a3a42ca946b98cc146345cfd0c2e-Ron E

应该是这样的:

legacyExchangeDN : /o=First Organization/ou=Exchange Administrative Group (FYDIBOHF23SPDLT)/cn=Recipients/cn=6131a3a42ca946b98cc146345cfd0c2e-Ron E

这会影响多个用户,我可以手动更新AD属性编辑器中的值,但我希望能够自动执行此操作。

这是我到目前为止所拥有的:

#List all users to check existing values

$ADUserList = Get-ADUser -Filter* -Properties * | fl name, EmailAddress, legacyExchangeDN

#Replace value with space with value without space

Set-ADUser reyer -Replace @{legacyExchangeDN="/o=  ","/o="}

第二行产生以下错误:

Set-ADUser : Multiple values were specified for an attribute that can have only one value
At line:1 char:1
+ Set-ADUser reyer -Replace @{legacyExchangeDN="/o=  ","/o="}

感觉我在这里很容易丢失一些东西,但我找不到它。我正在用一个用户测试这个。一旦测试,我想在一个脚本中替换所有剩余用户的值。如果我只针对那些符合在该字段中具有空间的标准的用户,那肯定会有助于存储它或管道覆盖。

我的最终结果如下:

  1. 目标用户在legacyExchangeDN的文本值中有空格--->“/ o =”

  2. 将“/ o =”替换为“/ o =”,同时保留文本值的其余部分 - >“/ o =第一个组织/ ou = Exchange管理组(FYDIBOHF23SPDLT)/ cn =收件人/ cn = 6131a3a42ca946b98cc146345cfd0c2e-Ron E“

  3. 先谢谢您的时间和精力!

1 个答案:

答案 0 :(得分:0)

$Users = Get-ADUser -Filter { legacyExchangeDN -like '*/o= *' } -Properties @('name','EmailAddress','legacyExchangeDN')
ForEach ($User in $Users)
{
    $Replace = $User.legacyExchangeDN -replace '/o=\s','/o='
    Set-ADUser -Identity $User -Replace @{ legacyExchangeDN = $Replace }

    Write-Host ('Updated "{0}" ({1}) to "{2}"' -f
        @($User.name,$User.EmailAddress,$Replace))
}

这也会更快。口头禅是:过滤左,格式右。 Set-ADUser takes an ADUser object-Replace[HashTable]用于为命名属性分配新值(在LDAP中显示)。

(更新:删除了foreach的管道)

要实施日志记录,请将Write-Host替换为:

'Updated "{0}" ({1}) to "{2}"' -f @($User.name,$User.EmailAddress,$Replace) |
    Out-File -FilePath "$env:UserProfile\ADChanges.txt" -Append