PowerShell重置AD组织单元用户密码脚本无输出问题排查
脚本无法输出结果的核心问题
- 范围配置错误:
Get-ADUser未加-SearchBase参数指定目标组织单元,默认会遍历整个域的用户,不符合指定OU操作的需求。 - 拼写错误:属性名
DistinguishedName拼写错误,且过滤条件未排除已禁用账号,容易产生无效操作。 - 无效命令:不存在
Get-ADAccountPassword这个重置密码的cmdlet,且代码中该命令参数截断为-Rese,属于完全无效的调用。 - 参数缺失:
Set-ADAccountPassword执行时必须通过-Identity参数指定目标用户,你的循环逻辑中未绑定当前遍历的用户对象,命令无操作目标自然不会产生任何输出。 - 密码定义错误:双引号包裹的字符串会自动解析
$$这类PowerShell特殊标记,最终生成的密码和你预期的NewP@$$wOrd不一致,极易触发密码复杂度报错。 - 结果捕获逻辑错误:
Set-ADAccountPassword默认执行成功后无任何返回值,直接将循环赋值给$Results变量本身就拿不到执行结果,需要主动构造结果对象记录成功/失败状态。
修正后可直接运行的脚本
Import-Module ActiveDirectory -ErrorAction Stop # 替换为目标组织单元的可分辨名称,格式示例:OU=员工账号,DC=company,DC=local $targetOU = "OU=员工账号,DC=company,DC=local" # 拉取目标OU下密码永不过期的启用账号 $users = Get-ADUser -Filter * -SearchBase $targetOU -SearchScope Subtree -Properties PasswordNeverExpires, Enabled | Where-Object { $_.PasswordNeverExpires -eq $true -and $_.Enabled -eq $true } | Select-Object DistinguishedName, Name, SamAccountName # 单引号包裹明文密码,避免特殊字符被PowerShell转义 $resetPassword = ConvertTo-SecureString -AsPlainText 'NewP@2024ssw0rd' -Force $results = @() foreach ($user in $users) { $record = [PSCustomObject]@{ 姓名 = $user.Name 登录账号 = $user.SamAccountName 重置结果 = "" 错误信息 = "" } try { Set-ADAccountPassword -Identity $user.DistinguishedName -NewPassword $resetPassword -Reset -ErrorAction Stop # 如需让用户下次登录必须改密码,取消下面行的注释 # Set-ADUser -Identity $user.DistinguishedName -ChangePasswordAtLogon $true $record.重置结果 = "成功" } catch { $record.重置结果 = "失败" $record.错误信息 = $_.Exception.Message } $results += $record } # 控制台输出结果 $results | Format-Table -AutoSize # 如需导出结果到CSV文件,取消下面行的注释 # $results | Export-Csv -Path ".\AD密码重置结果.csv" -NoTypeInformation -Encoding UTF8
运行前注意事项
- 执行脚本的机器需要安装RSAT ActiveDirectory管理模块,且运行PowerShell的账号拥有对应OU的用户密码重置权限。
- 替换
$targetOU为实际要操作的OU路径,不要直接使用示例值。 - 设置的重置密码必须符合域配置的密码长度、复杂度要求,否则会重置失败。
内容的提问来源于stack exchange,提问作者Mike Blevins
相关产品推荐
相关产品推荐

