PowerShell通过CSV将AD禁用用户迁移至指定OU的问题咨询
报错核心原因
- PowerShell 读取带特殊字符(短横线、空格)的CSV字段时,不能直接写
$_.E-mail,会被识别为$_ . E - mail的运算表达式,读取不到值返回null,触发参数空值报错。 Get-ADUser的-Identity参数仅支持4类值作为输入:可分辨名称(DN)、对象GUID、安全标识符(SID)、SAM账号名(sAMAccountName),不支持直接传入邮箱、UPN作为-Identity的参数值。
可替换sAMAccountName的有效字段
你提供的CSV字段里有两类唯一标识字段可用:
- User logon name:如果该字段是不带@的短用户名(即Windows 2000以前版本的登录名,本质就是sAMAccountName),可以直接传入
-Identity参数,查询效率最高 - User principal name:AD全局唯一标识,不会出现重复,需要通过
-Filter参数查询使用
修正后的脚本示例
固定目标OU版本(所有用户迁移到同一个停权OU)
# 替换为你的停权用户专属OU的可分辨名称 $TargetOU = "ou=停权用户,dc=MyDomain,dc=com,dc=au" Import-Csv -Path "C:\你的用户列表.csv" | ForEach-Object { # 这里用User principal name查询,如果你要改用User logon name,把下面Filter里的字段名替换即可 $adUser = Get-ADUser -Filter "UserPrincipalName -eq '$($_.'User principal name')'" # 加空值判断避免报错 if ($adUser) { Move-ADObject -Identity $adUser.DistinguishedName -TargetPath $TargetOU Write-Host "已迁移用户:$($adUser.Name)" } else { Write-Warning "未找到对应用户:$($_.'User principal name')" } }
CSV带目标OU版本(不同用户迁移到不同OU)
Import-Csv -Path "C:\你的用户列表.csv" | ForEach-Object { $adUser = Get-ADUser -Filter "UserPrincipalName -eq '$($_.'User principal name')'" $TargetOU = $_.'MoveTOOU' if ($adUser -and $TargetOU) { Move-ADObject -Identity $adUser.DistinguishedName -TargetPath $TargetOU Write-Host "已迁移用户:$($adUser.Name) 到OU:$TargetOU" } else { Write-Warning "用户或目标OU信息缺失,跳过:$($_.'User principal name')" } }
内容的提问来源于stack exchange,提问作者Karthikeyan V
相关产品推荐
相关产品推荐

