批量修改AD中指定OU用户的主SMTP地址
问题分析与脚本修正
原脚本不生效的核心原因
- 未提交AD修改:
Set-ADUser -instance $_被注释,逻辑正确也不会同步修改到AD。 - 原主地址未降级:只把第一个
@domain1.com地址设为主,但未将原主地址(SMTP:first.last@domain2.net)降级为次要地址(smtp:前缀),AD仍会保留原主地址。 - 多值属性处理不稳定:用
-instance更新AD用户时,多值属性(如ProxyAddresses)的变更检测易出问题,直接指定-ProxyAddresses参数更可靠。
修正后的脚本
# 获取目标OU内用户,加载ProxyAddresses属性 Get-ADUser -Filter * -SearchBase 'OU=users_test,OU=Test,DC=test,DC=local' -Properties ProxyAddresses | ForEach-Object { $updatedProxies = @() $primarySet = $false foreach ($addr in $_.ProxyAddresses) { $lowerAddr = $addr.ToLower() # 把所有domain2.net的地址降级为次要 if ($lowerAddr -like 'smtp:*@domain2.net') { $updatedProxies += $lowerAddr } # 将第一个domain1.com的地址设为主地址 elseif (!$primarySet -and $lowerAddr -like 'smtp:*@domain1.com') { $updatedProxies += "SMTP:$($lowerAddr.Substring(5))" $primarySet = $true } # 其他地址保持原样,非目标主地址统一转成次要前缀 else { if ($addr.StartsWith('SMTP') -and !$addr.EndsWith('@domain1.com')) { $updatedProxies += $lowerAddr } else { $updatedProxies += $addr } } } # 先输出验证修改结果,确认正确后再取消注释Set-ADUser Write-Host "用户 $($_.SamAccountName) 新邮件地址列表:" $updatedProxies | ForEach-Object { Write-Host " $_" } # 提交修改到AD(确认输出正确后取消注释) # Set-ADUser -Identity $_ -ProxyAddresses $updatedProxies }
关键修正说明
- 统一前缀处理:转小写前缀避免大小写判断混乱,确保所有地址的前缀逻辑一致。
- 强制降级原主地址:将所有
@domain2.net的地址设为次要,彻底替换原主地址的优先级。 - 显式设置新主地址:把第一个匹配的
@domain1.com地址标记为大写SMTP:前缀,明确设置为主地址。 - 安全验证机制:先通过
Write-Host输出修改结果,确认逻辑无误后再执行AD修改操作。
注意事项
- 执行脚本需要AD管理员权限,且环境需安装RSAT-AD-PowerShell模块。
- 建议先在测试OU验证效果,确认无误后再批量应用到生产环境。
- 若需指定特定
@domain1.com地址(如优先first.last@domain1.com),可调整匹配顺序,先判断精准格式再处理其他domain1地址。
内容的提问来源于stack exchange,提问作者ABC
相关产品推荐
相关产品推荐

