如何导入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
相关产品推荐
相关产品推荐

