Windows AD 凭据异常导致用户无法登录的排查
凭据异常导致用户无法登录的排查 —— 故障演练脚本
用途:AD 运维每日研究 Topic #2(重点) 适用环境:可随意折腾的多 VM 测试环境(建议先拍快照) 产出物:一份可当工作日志提交的《用户凭据异常登录故障排查报告》 定位:这是 AD 运维中最高频、分支最多的故障类型,排查能力的核心体现
0. 一页速览(TL;DR)
| 项 | 内容 |
|---|---|
| 核心难点 | 用户嘴里说的”登录不上”是症状,不是根因;同一症状对应至少 5 类不同根因 |
| 排查主线 | 先定位失败环节(DNS→网络→DC 可达→认证协议→账号状态→凭据本身),再往内收 |
| 最关键的一句 | 先问清楚 “在哪登录、报什么错、别人是否也这样”,能砍掉一半排查量 |
| 高频根因 | 账号锁定 / 密码过期 / Kerberos 票据问题 / 缓存凭据 / DC 复制不一致 / 时间偏差 |
| 最大陷阱 | 上来就重置密码——掩盖根因、丢失证据,还可能把”锁定”变成”密码错误” |
| 交付价值 | 形成一套可复用的《用户登录故障分诊表》 |
1. 场景设定(背景故事)
工单摘要(周一 08:40,早高峰)
- 用户张三反馈:登录域内 OA 系统提示”用户名或密码错误”,昨天还好好的;
- 同时他反馈:登录自己电脑(加域 Win10)也进不去,提示”用户名或密码不正确”;
- IT 同事帮他重置了密码,当场能进,10 分钟后又不行了;
- 隔壁工位的李四同样的问题,但财务部的人都正常;
- 服务台同时收到 3 个类似工单,分散在不同部门。
设计意图: “重置密码后短暂恢复又复发”是账号被持续锁定的典型指纹——说明有个”内鬼”在拿旧密码不断尝试认证(可能是手机邮件客户端、缓存的服务凭据、或计划任务)。 “隔壁同样问题、本部门正常”则指向子网/站点/DC 归属层面。
这个故事里同时埋了 2 个独立根因,考察排障者能否分离而非混为一谈。
2. 造障步骤(五档,覆盖五类根因)
⚠️ 仅在测试环境执行。执行前对全部 DC 拍快照。 建议每档单独练一次,不要一次全上,否则无法归因。
档 1:账号被锁定(Lockout)—— 最高频
# 先把域锁定策略改严,方便快速触发# (默认域策略或细粒度策略,阈值设为 3 次)# 然后故意用错密码触发锁定1..5 | ForEach-Object { $cred = New-Object System.Management.Automation.PSCredential( "QY\zhangsan", (ConvertTo-SecureString "WrongPwd123!" -AsPlainText -Force)) try { Start-Process cmd -Credential $cred -ErrorAction Stop } catch {}}
# 或者用 AD 工具直接锁定Unlock-ADAccount -Identity zhangsan # 先确保解锁状态# 再用错误密码反复认证,触发 lockout关键复现点:锁定后在另一台机器上持续用旧密码认证(模拟手机邮件客户端), 制造”重置密码后 10 分钟又锁定”的复发现象。
# 造一个"后台持续用旧密码"的进程(模拟手机客户端)# 可以在另一台测试机上挂一个循环任务,每 2 分钟用旧密码认证一次while ($true) { $c = New-Object System.Management.Automation.PSCredential( "QY\zhangsan", (ConvertTo-SecureString "OldPwd123!" -AsPlainText -Force)) try { Start-Process cmd -Credential $c -ErrorAction SilentlyContinue } catch {} Start-Sleep -Seconds 120}档 2:密码过期(Password Expired)
# 把密码设为已过期Set-ADUser -Identity zhangsan -ChangePasswordAtLogon $true# 或直接操作用户对象的 pwdLastSet$u = Get-ADUser zhangsan$u.pwdLastSet = 0Set-ADObject -Instance $u现象:能认证但立刻要求改密码;某些老旧应用(LDAP 简单绑定)会直接报”密码错误”。
档 3:Kerberos 票据问题
# 在客户端清空票据,制造"看似无凭据"的状态klist purge
# 制造 SPN 重复(Kerberos 集成认证失败的经典根因)setspn -S HTTP/oa.qy.net QY\svc_oasetspn -S HTTP/oa.qy.net QY\svc_oa2 # 重复注册同一个 SPN现象:交互式登录正常,但 Web 系统的集成认证(SSO)失败——这是”能登电脑、登不上系统”的分水岭。
档 4:缓存凭据 / 本地缓存污染
# 在客户端制造缓存的旧凭据cmdkey /add:oa.qy.net /user:QY\zhangsan /pass:OldPwd123!# 手动清理测试:cmdkey /listcmdkey /delete:oa.qy.net现象:用户”明明密码是对的”,但某个应用始终用缓存的旧密码认证。
档 5:DC 复制不一致 / 站点归属
# 让某台 DC 停止复制,造成密码不同步repadmin /options QYNET-CORE02 +DISABLE_INBOUND_REPL# 在 CORE01 上改密码,CORE02 上仍是旧密码Set-ADAccountPassword -Identity zhangsan -Reset ` -NewPassword (ConvertTo-SecureString "NewPwd456!" -AsPlainText -Force)# 让部分客户端指向 CORE02 认证 → 用新密码反而登不上现象:“换个网段就好了 / 重启就好了”——用户归属的 DC 尚未收到新密码。
3. 故障现象分诊表(核心工具)
这张表是本文档最有价值的部分,建议打印贴在工位上。
| 现象特征 | 高度怀疑 | 首要检查 |
|---|---|---|
| 重置密码后短时可用,随后又失败 | 账号锁定 | 锁定源:4740 事件、Get-ADUser -Properties LockedOut |
| 能登录电脑,登不上 Web/SSO | Kerberos / SPN | klist、setspn -X(查重复 SPN) |
| 提示”密码已过期” | 密码过期 | Get-ADUser -Properties PasswordExpired,pwdLastSet |
| 只有某几个用户有问题,同组其他人正常 | 账号个体问题 | 该用户的属性、组、锁定状态 |
| 同一楼层/网段用户都异常,其他正常 | DC / 站点 / 子网归属 | nltest /dsgetdc:qy.net、AD 站点与子网配置 |
| 所有用户都异常 | DC 故障 / DNS / 时间 | DC 可达性、w32tm /monitor |
| 只有某个应用不行,其他都行 | 应用侧缓存凭据 / SPN | cmdkey /list、应用日志、SPN |
| 间歇性、重试能进 | 时间偏差 / 复制延迟 | KRB_AP_ERR_SKEW、repadmin /replsummary |
4. 标准排查路径(参考答案)
第 0 步:三问定方向(最省时间的一步)
在动手敲命令前,必须问清:
- 在哪登录失败?(本机 / Web SSO / VPN / 邮件客户端 / 共享盘) → 判断是”域登录”还是”应用认证”,两者根因库完全不同。
- 报什么错?(原样抄下提示,或截图) → “用户名或密码错误” vs “账户已锁定” vs “信任关系失败” 指向完全不同的分支。
- 是否只有他一个人?(同部门、同楼层、同网段分别问) → 快速区分”个体问题”和”范围问题”,这一问能砍掉一半排查量。
第 1 步:确认账号状态(最快见效)
# 账号是否被锁定Get-ADUser zhangsan -Properties LockedOut, Enabled, PasswordExpired, ` PasswordLastSet, LastBadPasswordAttempt, BadLogonCount | Select-Object Name, Enabled, LockedOut, PasswordExpired, ` PasswordLastSet, LastBadPasswordAttempt, BadLogonCount
# 直接用 Search-ADAccount 找所有锁定账号Search-ADAccount -LockedOut | Select-Object Name, SamAccountName, LockedOut
# 解锁Unlock-ADAccount -Identity zhangsan注意:解锁只是止血。必须找到锁定源,否则 10 分钟后又锁。
第 2 步:找锁定源(本主题的精髓)
这是区分”新手”和”老手”的地方。 锁定源在发起认证的那台机器上留痕,不在 DC 上。
# 在 PDC Emulator 上查锁定事件(锁定事件集中在 PDC)Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4740} -MaxEvents 20 | Select-Object TimeCreated, @{n='User';e={$_.Properties[0].Value}}, @{n='SourceComputer';e={$_.Properties[1].Value}} | Format-Table -AutoSizeEvent ID 4740 的 SourceComputer 字段就是锁定发起者的机器名——这就是你要抓的”内鬼”。
找到那台机器后,继续追:
# 在那台机器上查 4625(登录失败)的进程与来源Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4625} -MaxEvents 30 | Where-Object { $_.Properties[5].Value -eq 'zhangsan' } | Select-Object TimeCreated, @{n='LogonType';e={$_.Properties[10].Value}}, @{n='Process';e={$_.Properties[18].Value}}, @{n='SourceIP';e={$_.Properties[19].Value}} | Format-Table -AutoSize常见锁定源排查清单:
| 锁定源 | 特征 | 处理 |
|---|---|---|
| 手机邮件客户端(ActiveSync) | 每 1–5 分钟一次认证,LogonType 8 | 删除手机上的旧账号配置 |
| 缓存的映射驱动器 | 开机自动尝试连接 | net use * /delete、清理凭据管理器 |
| 计划任务 / 服务账号 | 定时触发 | 更新任务中的凭据 |
| 旧电脑 / 旧会话 | 长期未关机 | 找到并关机/重配 |
| 第三方系统对接 | 用 LDAP 简单绑定 | 更新对接配置 |
| 用户自己反复试错 | 短时间大量失败 | 告知用户停止尝试 |
关键洞察:LogonType 8(NetworkCleartext)几乎必然是邮件客户端或应用在用旧密码认证;LogonType 3(Network)通常是映射驱动器或共享访问。
第 3 步:区分”域登录失败”和”应用认证失败”
域登录(能登电脑吗?)
# 客户端上查看当前登录的 DC 和令牌whoami /allnltest /dsgetdc:qy.net # 当前用的是哪台 DCnltest /sc_query:qy.net # 安全通道状态
# Kerberos 票据klist # 查看是否有 TGTklist purge # 清空票据后重试(排除票据污染)应用认证(Kerberos SSO 失败)
# 检查 SPN 是否重复注册 —— SSO 失败的头号根因setspn -X # 查找重复 SPNsetspn -L svc_oa # 查看某账号注册的 SPN
# 检查委派(若应用需要委派)Get-ADUser svc_oa -Properties TrustedForDelegation, ` msDS-AllowedToDelegateTo判据:
- 能登电脑 + 登不上 SSO → 查 SPN / Kerberos,不要查密码
- 电脑都登不上 → 查账号状态 / DC / 网络 / 时间
第 4 步:检查复制与 DC 一致性(“重启就好了”型)
# 复制健康总览repadmin /replsummary
# 查特定账号在各 DC 上的密码是否一致repadmin /showobjmeta QYNET-CORE01 "CN=张三,OU=Users,DC=qy,DC=net" | Select-String "pwdLastSet|unicodePwd"
# 如果怀疑某台 DC 数据陈旧repadmin /showrepl QYNET-CORE02现象对应:用户”换台电脑就好了""重启就好了”→ 他连到了尚未收到新密码的 DC。
第 5 步:时间层检查(别忘了老朋友)
w32tm /monitor /domain:qy.netKerberos 容差 5 分钟,超了就报 KRB_AP_ERR_SKEW(见 Topic #1)。
“凭据问题”和”时间问题”症状高度重合,必须交叉排除。
第 6 步:清除客户端缓存凭据
cmdkey /list # 查看缓存的凭据cmdkey /delete:oa.qy.net # 删除指定目标# 或图形化:控制面板 → 凭据管理器 → Windows 凭据5. 陷阱与常见误区
| # | 误区 | 正确做法 | 后果 |
|---|---|---|---|
| 1 | 上来就重置密码 | 先查锁定状态和锁定源 | 掩盖根因、丢失证据、10 分钟后再锁 |
| 2 | 只解锁不找源 | 必须查 4740 的 SourceComputer | 反复复发,用户失去信任 |
| 3 | 把 SSO 失败当密码错误查 | 先问”能登电脑吗” | 浪费大量时间在无关方向 |
| 4 | 只看 DC 日志 | 锁定源在客户端 | 永远找不到内鬼 |
| 5 | 忽略手机/移动设备 | 问用户”手机还配着邮箱吗” | 这是最高频的锁定源 |
| 6 | 忘记排除时间问题 | w32tm /monitor 交叉验证 | 误判为凭据问题 |
| 7 | 忽略复制延迟 | repadmin /replsummary | “重启就好了”的问题查不出来 |
| 8 | 不记录原始报错 | 让用户截图 / 抄原文 | 后续无法归因 |
6. 命令速查表
| 目的 | 命令 |
|---|---|
| 查账号完整状态 | Get-ADUser <u> -Properties LockedOut,Enabled,PasswordExpired,PasswordLastSet,LastBadPasswordAttempt,BadLogonCount |
| 查所有锁定账号 | Search-ADAccount -LockedOut |
| 解锁账号 | Unlock-ADAccount -Identity <u> |
| 查锁定源(核心) | Get-WinEvent -FilterHashtable @{LogName='Security';Id=4740} |
| 查失败登录明细 | Get-WinEvent -FilterHashtable @{LogName='Security';Id=4625} |
| 查成功登录 | Get-WinEvent -FilterHashtable @{LogName='Security';Id=4624} |
| 查当前 DC | nltest /dsgetdc:<域> |
| 查安全通道 | nltest /sc_query:<域> |
| 查 Kerberos 票据 | klist / klist purge |
| 查重复 SPN | setspn -X |
| 查账号 SPN | setspn -L <账号> |
| 查委派配置 | Get-ADUser <u> -Properties TrustedForDelegation,msDS-AllowedToDelegateTo |
| 复制健康 | repadmin /replsummary |
| 对象元数据 | repadmin /showobjmeta <DC> "<DN>" |
| 缓存凭据 | cmdkey /list / cmdkey /delete:<目标> |
| 时间偏差 | w32tm /monitor /domain:<域> |
7. 高频根因 TOP 5(实战排名)
- 手机/移动端邮件客户端用旧密码持续认证 → 账号反复锁定 (实战中出现频率最高,且最容易被忽略)
- 密码过期 + 老旧应用不提示,直接报”密码错误”
- SPN 重复或缺失 → Kerberos SSO 失败
- 客户端缓存凭据(凭据管理器 / 映射驱动器 / 计划任务)
- DC 复制不一致 → “换台电脑/重启就好了”
8. 工作日志模板(可直接改)
# 工作日志:用户凭据异常导致无法登录的排查与处理
日期:YYYY-MM-DD执行人:环境:测试域 qy.net(QYNET-CORE01/02)关联 Topic:AD 每日研究 #2 凭据异常导致用户无法登录工单来源:[服务台 / 用户直接反馈]
## 一、问题现象- 报障人:___,报障时间:___- 失败场景:登录 [本机 / OA系统 / VPN / 邮件客户端 / 共享盘]- 原始报错(原样记录):___- 影响范围:[仅本人 / 同部门 / 同网段 / 全部用户]- 是否已尝试过操作:[如已重置密码 → 记录重置时间与效果]
## 二、排查过程1. 【三问定方向】 - 在哪登录失败:___ - 报什么错:___ - 是否只有他:___2. 【账号状态】执行 `Get-ADUser ... -Properties LockedOut,...` - LockedOut = ___,PasswordExpired = ___,BadLogonCount = ___ - LastBadPasswordAttempt = ___3. 【锁定源定位】执行 4740 事件查询 - SourceComputer = ___(锁定发起机器) - 该机器上 4625 事件:LogonType = ___,Process = ___,SourceIP = ___ - 结论:锁定源为 ___4. 【域登录 vs 应用认证】 - 能否登录本机:___ - `klist` 票据情况:___ - `setspn -X` 重复 SPN 检查结果:___5. 【复制与一致性】`repadmin /replsummary` → ___6. 【时间排除】`w32tm /monitor` → 偏差 ___ ms7. 【排除项】已确认与以下无关:___
## 三、根因[一句话,例如:"用户手机上残留的旧邮箱配置持续以旧密码认证,导致账号每 3 分钟触发一次锁定阈值,表现为'重置密码后短暂可用又复发'"]
## 四、处理动作1. 止血:`Unlock-ADAccount` 解锁账号2. 根治:在 ___ 设备/系统上删除/更新旧凭据配置3. 清理:客户端 `cmdkey` 缓存凭据清理(如有)4. 验证:用户重新登录测试 ___ 次,成功 ___ 次
## 五、验证结果- 账号锁定状态持续观察 ___ 分钟无复发- 4740 事件:处理后 ___ 分钟内无新增- 用户业务恢复确认:___
## 六、复盘与改进- 教训:[例如"账号锁定类问题必须先定位锁定源,解锁只是止血"]- 待办: - [ ] 整理《用户登录故障分诊表》并分享给服务台 - [ ] 部署账号锁定监控告警(4740 事件触发通知) - [ ] 梳理域内使用旧凭据的服务/任务清单 - [ ] 推动移动设备邮箱配置的规范化 - [ ] [其他]
## 七、耗时统计- 现象确认与信息收集:___ 分钟- 排查定位:___ 分钟- 处理与验证:___ 分钟- 合计:___ 分钟9. 延伸研究方向
- 自动化锁定源分析:写一个脚本,输入用户名 → 自动聚合 4740 + 4625 事件 → 输出”锁定源 TOP 清单”,直接给服务台用。
- 细粒度锁定策略:为服务账号设置独立的高阈值 PSO,避免定时任务被误锁。
- Kerberos 深入:SPN、委派(约束/非约束/基于资源的 RBCD)、票据生命周期、双跳问题。
- 凭据攻击视角:密码喷洒(Password Spray)的特征——大量账号各失败一两次,与”单账号被锁定”模式相反,值得做对比分析。
- 旧协议清理:NTLM 依赖排查(与 Topic #1 延伸方向呼应),LDAP 明文绑定的风险。
- 自助服务:账号解锁自助门户、密码自助重置(SSPR)的落地与安全边界。
- 审计与合规:登录事件的留存周期、取证价值、隐私边界。
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!













