PowerShell无法直接检查密码强度,而是通过策略合规性、登录失败日志和硬编码凭证扫描间接识别弱口令风险账户:检查PasswordNeverExpires、PasswordLastSet属性;聚合ID 4625事件分析爆破痕迹;用Select-String扫描脚本中明文密码。
powershell 本身不提供直接检查用户密码强度或明文密码的功能,这是 windows 安全机制的硬性限制:密码哈希(如 ntlm 或 kerberos)受系统保护,普通权限甚至管理员也无法读取或解密。所谓“检查弱密码”,实际是指结合策略、日志、行为特征和外部线索,间接识别高风险账户——不是破解密码,而是发现“很可能用弱口令”的账号。
以下方法聚焦合法、合规、可落地的 PowerShell 实战路径,适用于域环境与本地账户场景:
用密码策略 + 账户属性识别高风险用户
Windows 域策略(或本地安全策略)会强制执行最小密码长度、复杂性等要求。但策略生效≠用户已遵守。可通过以下方式定位“绕过策略”或“长期未改密”的脆弱点:
- 启用并查询
msDS-UserPasswordExpiryTimeComputed属性,找出密码即将过期或已过期却仍可用的账户(常因禁用密码过期策略或手动重置导致) - 检查
PasswordLastSet时间:超过90天未更新的账户,大概率使用静态密码,易被复用或爆破 - 筛选
Enabled -eq $true且PasswordNeverExpires -eq $true的账户——尤其是服务账户、旧管理员账号,是典型弱口令温床
示例命令(域环境,需 AD 模块):
Get-ADUser -Filter {(Enabled -eq $true) -and (PasswordNeverExpires -eq $true)} -Properties PasswordLastSet,PasswordNeverExpires |
Select-Object Name,SamAccountName,PasswordLastSet,PasswordNeverExpires |
Export-Csv "C:\WeakCandidate_Report.csv" -NoTypeInformation结合登录失败日志发现暴力猜测痕迹
弱口令账户往往伴随大量失败登录事件。PowerShell 可快速聚合安全事件日志(ID 4625)中高频失败目标:
- 使用
Get-WinEvent查询最近24小时失败登录次数 Top 10 用户 - 过滤来源 IP 高度集中、用户名存在常见模式(如
admin、test、guest)的记录
示例(需管理员权限):
$failures = Get-WinEvent -FilterHashtable @{
LogName='Security'; ID=4625; StartTime=(Get-Date).AddHours(-24)
} -ErrorAction SilentlyContinue |
Group-Object -Property 'Properties[5].Value' | # 用户名在第6个属性(索引5)
Sort-Object Count -Descending |
Select-Object -First 10 Name,Count
$failures | Where-Object {$_.Name -match '^(admin|test|guest|administrator)$'} |
ForEach-Object { Write-Host "⚠ 高危用户名被爆破 $_.Name ($($_.Count) 次)" }扫描配置文件与脚本中的硬编码凭证(最有效突破口)
真实环境中,弱口令最大泄露源不是AD数据库,而是明文写在脚本、配置文件、备份文件里的密码。PowerShell 的 Select-String 和 FindAll(Windows 10/11 内置)可高效定位:
- 查找含
password=、pwd=、-Credential后跟明文字符串的.ps1、.bat、.config文件 - 排查
C:\inetpub\、C:\Scripts\、C:\Temp\等高危路径
示例(谨慎运行,避免误删):
# 查找所有.ps1文件中疑似明文密码的行 Get-ChildItem C:\Scripts -Recurse -Include "*.ps1" -ErrorAction SilentlyContinue | Select-String -Pattern "(?i)(password\s*=\s*['""]|pwd\s*=\s*['""]|convertto-securestring.*['""])" | Select-Object Filename,LineNumber,Line | Export-Csv "C:\CredentialLeak_Report.csv" -NoTypeInformation
补充:本地管理员组成员与默认账户审计
内置账户(如 Administrator、Guest)若启用且密码未改,即默认弱口令风险点:
# 列出本地管理员组所有成员(含域用户),重点关注无描述、命名规范的账号
net localgroup administrators | Select-String -Pattern "^[\w.-]+$" | ForEach-Object {
$user = $_.ToString().Trim()
if ($user -notmatch '^\.$' -and $user -notmatch '^Administrator$') {
Write-Host "? 非标准管理员: $user"
}
}不依赖密码本身,而是从策略缺口、行为异常、配置残留三个维度交叉验证,才是 PowerShell 在弱口令治理中真正可靠的做法。

















