使用New-ADUser创建AD用户成功但密码未生效的问题排查
脚本密码未生效的排查与修复
核心问题排查
变量名拼写错误
脚本中定义的用户列表变量是$userslist,但foreach循环遍历的是$userlist(少了一个s),这会导致循环根本不会执行。如果你的实际账号创建成功,说明可能是笔误,但这个错误必须修正,否则后续批量创建会失效:# 修正前 foreach($user in $userlist){ # 修正后 foreach($user in $userslist){ }AD密码策略限制
即使脚本中指定了密码,若密码不符合域的密码策略(比如长度不足、缺少大小写/特殊字符、重复历史密码等),New-ADUser可能不会抛出错误,但密码不会被正确设置。可以先手动验证密码是否符合当前域的策略,或者在脚本中添加密码合规性检查。SecureString生成验证
确保ConvertTo-SecureString正确生成安全字符串,可以在脚本中添加验证步骤:$securePassword = ConvertTo-SecureString $password -AsPlainText -Force Write-Host "生成的安全字符串类型: $($securePassword.GetType().FullName)"若输出不是
System.Security.SecureString,说明转换过程有问题。
修正后的完整脚本
# 测试用用户列表 $userslist = @('Julie Bowen') $password = "Pass123!" foreach($user in $userslist){ $userParts = $user.Split(" ") $firstName = $userParts[0] $lastName = $userParts[-1] $dnsroot = '@example.com' $accountname = "$firstName.$lastName" $samname = $accountname + $dnsroot Write-Host "创建用户: $samname" # 生成安全字符串并验证 $securePassword = ConvertTo-SecureString $password -AsPlainText -Force if($securePassword -is [System.Security.SecureString]){ Write-Host "安全字符串生成成功" } $userDetails = @{ GivenName = $firstName Surname = $lastName Name = "$firstName $lastName" SamAccountName = $accountName UserPrincipalName = $accountName + $dnsroot AccountPassword = $securePassword Enabled = $true ChangePasswordAtLogon = $true # 若需要指定目标OU,添加Path参数 # Path = "OU=Users,DC=example,DC=com" } if($firstName -eq "Julie"){ # 使用-PassThru参数返回创建的用户对象,便于验证 $newUser = New-ADUser @userDetails -PassThru if($newUser){ Write-Host "用户创建成功,账号名: $($newUser.SamAccountName)" } } }
额外验证步骤
创建用户后,可以运行以下命令检查密码是否正确设置:
Get-ADUser "Julie.Bowen" -Properties AccountExpirationDate, PasswordLastSet | Select-Object Name, PasswordLastSet
若PasswordLastSet有值,说明密码已成功应用;若为空,则密码未设置。
内容的提问来源于stack exchange,提问作者NateTRMF
相关产品推荐
相关产品推荐

