You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 = $_}
}

错误原因

  1. 导出格式缺陷:导出代码在拼接代理地址时,末尾会多生成一个-,拆分后得到空字符串,导致Set-ADUser尝试添加空值代理地址,触发AD操作异常。
  2. 参数类型不匹配:proxyAddresses是AD的多值属性,使用-add参数时必须传入数组类型值,循环中直接传单个字符串会触发类型错误。
  3. 代码笔误:第一个循环中使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 13:08:11