PowerShell中-split拆分代理地址后Set-ADUser执行异常问题
域迁移中CSV导出/导入proxyAddresses的问题
问题场景
跨域用户迁移过程中,导出用户proxyAddresses到CSV时使用了以下代码:
$userproxy = $null foreach($proxy in $foundUser.proxyAddresses) { if($proxy.substring(0,4) -like "smtp" -or $proxy.substring(0,4) -like "SMTP") { $userproxy += $proxy + "-" } }
导出的CSV示例数据:
"Name","givenName","sn","sAMAccountName","mail","mailNickname","mS-DS-ConsistencyGuid","targetAddress","proxyAddresses" "John Doe","John","Doe","B004796","jdoe@local.com","jdoe","7c8f6e36-7a21-254a-ae7b-85adb256a777","SMTP:jdoe@local.com","smtp:jdoe@local.grp-SMTP:jdoe@local.com-"
在目标域导入时,尝试用以下代码循环添加代理地址:
$proxyToAdd = $userInfo.proxyAddresses -split "-" foreach($proxy in $proxyToAdd){ Write-Host $item Set-ADUser $foundUser.sAMAccountName -add @{proxyAddresses = $proxy} }
执行时抛出错误:
smtp:jdoe@local.grp SMTP:jdoe@local.com Set-ADUser : add 所在位置 D:\Scripts\Migration Eneria\Traitement_Migration.ps1:48 : 13 + Set-ADUser $foundUser.sAMAccountName -add @{proxyAddresse ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation : (proteauclementt:ADUser) [Set-ADUser], ADInvalidOperationException + FullyQualifiedErrorId : ActiveDirectoryServer:0,Microsoft.ActiveDirectory.Management.Commands.SetADUser
改用管道写法后仍报「无效类型」错误:
$userInfo.proxyAddresses -split "-" | foreach{ Write-Host $_ Set-ADUser $foundUser.sAMAccountName -add @{proxyAddresses = $_} }
错误原因
- 导出格式缺陷:导出代码在拼接代理地址时,末尾会多生成一个
-,拆分后得到空字符串,导致Set-ADUser尝试添加空值代理地址,触发AD操作异常。 - 参数类型不匹配:
proxyAddresses是AD的多值属性,使用-add参数时必须传入数组类型值,循环中直接传单个字符串会触发类型错误。 - 代码笔误:第一个循环中使用
Write-Host $item,但循环变量是$proxy,会输出空值(非核心错误)。
解决方案
步骤1:修复导出代码,避免多余分隔符
改用数组收集代理地址,再用-join拼接,彻底避免末尾多余符号:
$userproxy = @() foreach($proxy in $foundUser.proxyAddresses) { if($proxy -cmatch '^smtp:') { # 正则匹配大小写不敏感的smtp开头,写法更简洁 $userproxy += $proxy } } $userproxyStr = $userproxy -join "-"
修改后导出的CSV中proxyAddresses字段不会出现末尾的-。
步骤2:修复导入代码,正确处理多值属性
拆分后过滤空值,选择批量添加或循环时传入数组:
# 拆分后过滤空字符串 $proxyToAdd = $userInfo.proxyAddresses -split "-" | Where-Object { $_ -ne '' } # 方法1:批量添加(推荐,减少AD操作次数) if($proxyToAdd.Count -gt 0) { Set-ADUser $foundUser.sAMAccountName -add @{proxyAddresses = $proxyToAdd} } # 方法2:循环添加(需将单个值包装成数组) foreach($proxy in $proxyToAdd){ if($proxy) { # 额外判断避免空值 Set-ADUser $foundUser.sAMAccountName -add @{proxyAddresses = @($proxy)} } }
关键注意点
- AD多值属性使用
-add时必须传入数组,单个值也要用@($proxy)包装成数组。 - 导出用数组收集再拼接,能避免生成多余分隔符。
- 导入时必须过滤空值,防止向AD添加无效的空代理地址。
内容的提问来源于stack exchange,提问作者Zaide F
相关产品推荐
相关产品推荐

