PowerShell无法直接检测域用户密码强度,但可通过检查空密码、永不过期等配置风险点,或对高价值账户进行低频LDAP/WMI登录验证来间接识别弱口令。
powershell 本身不能直接“检测域用户密码强度”,因为密码哈希不对外暴露,也无法逆向验证明文强度。但你可以通过两种方式间接识别疑似弱口令账户:一是检查账号是否符合已知弱口令特征(如空密码、永不过期、密码永不变),二是用合法凭据尝试登录验证(需谨慎控制频率,避免触发账户锁定)。
查配置层面的弱口令风险点
这类检查不涉及密码验证,只读取 AD 策略与用户属性,安全且推荐作为日常扫描项:
-
查找空密码或永不过期的用户:
Get-ADUser -Filter {(PasswordNotRequired -eq $true) -or (PasswordNeverExpires -eq $true)} -Properties PasswordNotRequired,PasswordNeverExpires | Select Name,ObjectClass,PasswordNotRequired,PasswordNeverExpires -
定位未启用密码策略约束的用户(绕过 FGPP):
Get-ADUser -Filter * -Properties msDS-ResultantPSO | Where-Object { -not $_."msDS-ResultantPSO" } | Select Name,"msDS-ResultantPSO" -
检查 Fine-Grained 密码策略是否宽松:
Get-ADFineGrainedPasswordPolicy -Filter * | Where-Object { $_.MinPasswordLength -lt 8 -or $_.PasswordHistoryCount -lt 24 -or $_.MaxPasswordAge -eq "00:00:00" } | Select Name,MinPasswordLength,PasswordHistoryCount,MaxPasswordAge
对特定账户做低风险登录验证
仅限测试少量高价值账户(如服务账号、管理员),且必须确保:
• 执行账号有足够权限;
• 目标账户未启用账户锁定策略,或已协调绕过;
• 每次验证间隔 ≥2 秒(SMB 速率限制默认生效)。
-
使用 LDAP 绑定验证(域用户):
$user = "CONTOSO\jdoe"; $pass = "P@ss123";
$de = New-Object System.DirectoryServices.DirectoryEntry("LDAP://DC=contoso,DC=com", $user, $pass);
if ($de.Name) { Write-Host "✓ 登录成功:$user" } else { Write-Host "✗ 凭据无效" } -
用 WMI 远程验证(需目标开启 WinRM 或 DCOM):
$cred = New-Object System.Management.Automation.PSCredential("CONTOSO\jdoe", (ConvertTo-SecureString "P@ss123" -AsPlainText -Force));
try { Get-WmiObject Win32_ComputerSystem -ComputerName "dc01.contoso.com" -Credential $cred -ErrorAction Stop | Out-Null; Write-Host "✓ 验证通过" } catch { Write-Host "✗ 验证失败" }
导出结果并人工复核
所有检查结果建议导出为 CSV 并脱敏处理,重点标记以下类型账户:
• LastLogonDate 超过 180 天 + 密码永不过期
• 属于 Domain Admins 但密码策略宽松
• 使用默认用户名(如 admin、administrator)且无 FGPP 约束
• 多个账户共用同一弱密码(需配合 Hash 对比,不在本脚本内)
注意:自动验证密码属于敏感操作,应避开业务高峰,记录执行日志,并在策略允许范围内进行。


















