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

如何导入CSV用户并按AD Office属性批量迁移用户至对应OU

问题诊断

原脚本存在以下语法错误与逻辑缺陷,无法正常运行:

  • ForEach-Object 语法错误:管道传递的foreach块不能直接使用($user in $users)写法,且脚本中未定义$users变量,会直接触发运行报错。
  • Get-ADUser 参数用法错误:-Identity和-Filter属于互斥参数,不能同时调用;多处存在参数漏空格、字符串缺闭合引号的问题,例如$displayname-Filter中间无分隔空格、"US - Tampa缺少后引号。
  • 命令换行错误:PowerShell中参数和传入值若拆分为独立行,会被识别为两条无关命令,原脚本多处将-TargetPath和对应OU路径拆分到不同行,直接触发参数缺失报错。
  • 逻辑冗余低效:对单个用户重复发起6次AD查询,不必要地增加域控压力,且没有异常处理逻辑,遇到重名用户、查无对应用户的场景会直接中断脚本。
  • 匹配风险:仅通过DisplayName匹配用户容易命中重名账号,没有校验逻辑容易出现错迁问题。
修正后可直接运行的脚本
# 导入AD运维模块
Import-Module ActiveDirectory -ErrorAction Stop

# 配置办公地点与目标OU的映射表,替换为你环境中实际的OU可分辨名称即可
$officeOuMapping = @{
    "China"           = "OU=China_Users,OU=Office_Users,DC=DOMAIN,DC=com"
    "Russia"          = "OU=Russia_Users,OU=Office_Users,DC=DOMAIN,DC=com"
    "US - Miami"      = "OU=Miami_Users,OU=US_Office_Users,OU=Office_Users,DC=DOMAIN,DC=com"
    "US - Tampa"      = "OU=Tampa_Users,OU=US_Office_Users,OU=Office_Users,DC=DOMAIN,DC=com"
    "US - Reno"       = "OU=Reno_Users,OU=US_Office_Users,OU=Office_Users,DC=DOMAIN,DC=com"
    "US - Charleston" = "OU=Charleston_Users,OU=US_Office_Users,OU=Office_Users,DC=DOMAIN,DC=com"
}

# 读取入职CSV文件,替换为实际文件路径
$userList = Import-Csv -Path "C:\AD_Test.csv"

foreach ($user in $userList) {
    # 姓名处理逻辑:优先使用首选名
    $firstName = $user.'Legal First Name'.Trim()
    $preferredFirstName = $user.'Preferred First Name'.Trim()
    if (-not [string]::IsNullOrWhiteSpace($preferredFirstName)) {
        $firstName = $preferredFirstName
    }
    $lastName = $user.'Last Name'.Trim()
    $displayName = "$firstName $lastName"

    try {
        # 查询AD用户,加载Office属性用于匹配
        $adUser = Get-ADUser -Filter { DisplayName -eq $displayName } -Properties Office -ErrorAction Stop
        # 重名校验
        if ($adUser.Count -gt 1) {
            Write-Warning "匹配到多个显示名为 $displayName 的用户,跳过迁移请手动核查"
            continue
        }
        # OU匹配校验
        $targetOu = $officeOuMapping[$adUser.Office]
        if (-not $targetOu) {
            Write-Warning "用户 $displayName 的办公地点 $($adUser.Office) 未配置对应OU,跳过迁移"
            continue
        }
        # 执行迁移操作
        Move-ADObject -Identity $adUser.DistinguishedName -TargetPath $targetOu -ErrorAction Stop
        Write-Host "已成功迁移用户 $displayName 至目标OU"
    }
    catch {
        Write-Warning "处理用户 $displayName 时出错:$_"
    }
}
使用注意事项
  • 运行前请替换$officeOuMapping中的OU路径为真实值,建议直接从AD用户和计算机控制台的目标OU属性编辑器中复制distinguishedName属性值,避免手动拼写错误。
  • 如果CSV中存储了用户SamAccountName、工号这类唯一标识,建议替换Get-ADUser的查询条件为对应字段,彻底避免重名导致的错迁问题。
  • 正式批量执行前,可先注释掉Move-ADObject行,预跑脚本核查输出的匹配结果是否正确,确认无误后再执行实际迁移。

内容的提问来源于stack exchange,提问作者whitemagic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 10:54:47