PowerShell遍历用户列表结合自定义函数批量重置AD账户密码
实现方案
你当前代码的核心问题是函数内的$Password是局部作用域变量,且函数没有返回值,外部代码无法捕获到函数内生成的密码,按以下步骤调整即可实现批量重置逻辑:
第一步:修正密码生成函数
首先修改New-Password的逻辑,去掉仅用于控制台打印的Write-Host,将生成的密码作为函数返回值输出,同时确保你自定义的Get-RandomCharacters、Scramble-String的执行结果正确赋值给$Password:
Function New-Password { $Password = $null # 注意要把两个辅助函数的执行结果赋值给$Password,否则变量始终为空 $Password = Get-RandomCharacters $Password = $Password | Scramble-String # 直接返回生成的明文密码,供外部调用捕获 return $Password }
注意:你自定义的
Get-RandomCharacters、Scramble-String函数需要放在New-Password之前定义,否则运行时会报命令不存在的错误。
第二步:编写批量处理逻辑
流程为:加载AD模块 → 导入用户名列表 → 遍历每个用户名,单独生成随机密码 → 转换为安全字符串后执行密码重置 → 记录操作结果留底。
完整可运行代码如下:
# 加载Active Directory模块,需提前安装RSAT-AD-PowerShell功能 Import-Module ActiveDirectory -ErrorAction Stop # --- 此处粘贴你自己实现的Get-RandomCharacters、Scramble-String函数 --- # Function Get-RandomCharacters { ... 你的原有逻辑 ... } # Function Scramble-String { ... 你的原有逻辑 ... } # 修正后的密码生成函数 Function New-Password { $Password = $null $Password = Get-RandomCharacters $Password = $Password | Scramble-String return $Password } # 导入用户名列表,示例为每行一个用户名的txt文件,替换为你实际的文件路径 $userList = Get-Content -Path "C:\scripts\ad_user_list.txt" # 遍历执行重置 foreach ($adUser in $userList) { try { # 为当前用户生成独立随机密码 $genPwd = New-Password # 转换为AD命令要求的安全字符串格式 $securePwd = ConvertTo-SecureString -AsPlainText $genPwd -Force # 执行密码重置 Set-ADAccountPassword -Identity $adUser -Reset -NewPassword $securePwd # 可选:重置成功后追加记录到结果csv,方便后续核对 [PSCustomObject]@{ 用户名 = $adUser 新密码 = $genPwd 重置时间 = Get-Date -Format "yyyy-MM-dd HH:mm:ss" 执行状态 = "成功" } | Export-Csv -Path "C:\scripts\reset_result.csv" -Append -NoTypeInformation -Encoding UTF8 } catch { # 记录失败信息 [PSCustomObject]@{ 用户名 = $adUser 新密码 = $genPwd 重置时间 = Get-Date -Format "yyyy-MM-dd HH:mm:ss" 执行状态 = "失败:$($_.Exception.Message)" } | Export-Csv -Path "C:\scripts\reset_result.csv" -Append -NoTypeInformation -Encoding UTF8 } }
注意事项
- 运行脚本的账号需要拥有对应AD组织单元的账户密码重置权限,运行前请确认已安装RSAT AD PowerShell管理工具
- 导出的结果csv包含所有用户的明文密码,请妥善加密存储,避免信息泄露
- 若你的用户名列表是csv格式,将
Get-Content替换为Import-Csv,遍历时取对应的用户名列即可,例如$userList = Import-Csv xxx.csv | Select-Object -ExpandProperty 用户名
内容的提问来源于stack exchange,提问作者Rich
相关产品推荐
相关产品推荐

