PowerShell从CSV导入用户到Active Directory报Directory Object Not Found错误如何解决
问题根因
- 首要原因:你CSV中指定的OU路径在Active Directory中不存在。报错的7个用户对应的OU大概率还未创建,或者OU的层级顺序写反了(AD的OU路径规则为子OU在前、父级/域在后,需要和你AD实际结构完全一致)
- 第二个问题:你的CSV文件没有
Password列,脚本中调用$User.Password会取到空值,New-ADUser的-AccountPassword参数要求传入合法的安全字符串,空值会触发报错 - 第三个问题:属性赋值逻辑错误,你脚本里把
$User.Name赋值给了$Firstname,但CSV里已经有单独的GivenName字段存储名字,现有写法会导致Name属性变成Scooby Doo这类重复拼接的情况,和你CSV里的Name列定义冲突。另外原脚本的用户查询条件使用脚本块写法,容易出现变量解析异常。
修复步骤
步骤1:验证所有OU是否存在
运行以下PowerShell命令验证你CSV里的每个OU是否真实存在,替换成你要查询的OU路径即可:
Get-ADOrganizationalUnit -Identity "OU=Board,OU=Management,DC=csc,DC=local"
如果返回找不到对象的错误,说明你需要先在AD中创建对应层级的OU,确保路径完全匹配CSV里Path字段的取值。
步骤2:修改CSV文件新增Password列
在CSV表头末尾加,Password,每行填写对应用户的初始密码,示例如下:
GivenName,Surname,Name,SamAccountName,Path,userPrincipalName,Password Scooby,Doo,Scooby,Scooby,"OU=Vehicles,OU=Production,DC=csc,DC=local",scooby@csc.local,P@ssw0rd123! Shaggy,Rogers,Shaggy,Shaggy,"OU=Vehicles,OU=Production,DC=csc,DC=local",shaggy@csc.local,P@ssw0rd123!
步骤3:修正PowerShell脚本
修正后的完整脚本如下,修复了密码转换、属性赋值、查询条件的问题:
# 导入CSV文件 $ADUsers = Import-csv C:\scripts\csc.csv foreach ($User in $ADUsers) { $Username = $User.SamAccountName # 将明文密码转换为AD要求的安全字符串格式 $Password = ConvertTo-SecureString $User.Password -AsPlainText -Force $Firstname = $User.GivenName $Lastname = $User.Surname $OU = $User.Path $UPN = $User.userPrincipalName # 检查用户是否已存在 if (Get-ADUser -Filter "SamAccountName -eq '$Username'" -ErrorAction SilentlyContinue) { Write-Warning "用户账户 $Username 已存在于Active Directory中" } else { New-ADUser ` -SamAccountName $Username ` -UserPrincipalName $UPN ` -Name $User.Name ` -GivenName $Firstname ` -Surname $Lastname ` -Enabled $True ` -ChangePasswordAtLogon $True ` -DisplayName "$Lastname, $Firstname" ` -Path $OU ` -AccountPassword $Password } }
步骤4:预校验后执行
可先在New-ADUser前添加Write-Output "即将创建用户 $Username,OU路径为 $OU",运行脚本查看输出的信息是否正确,确认无误后删除调试代码再执行正式创建即可。
内容的提问来源于stack exchange,提问作者DeathReaper
相关产品推荐
相关产品推荐

