Windows AD 凭据异常导致用户无法登录的排查

3826 字
19 分钟
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)—— 最高频#

Terminal window
# 先把域锁定策略改严,方便快速触发
# (默认域策略或细粒度策略,阈值设为 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 分钟又锁定”的复发现象。

Terminal window
# 造一个"后台持续用旧密码"的进程(模拟手机客户端)
# 可以在另一台测试机上挂一个循环任务,每 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)#

Terminal window
# 把密码设为已过期
Set-ADUser -Identity zhangsan -ChangePasswordAtLogon $true
# 或直接操作用户对象的 pwdLastSet
$u = Get-ADUser zhangsan
$u.pwdLastSet = 0
Set-ADObject -Instance $u

现象:能认证但立刻要求改密码;某些老旧应用(LDAP 简单绑定)会直接报”密码错误”。

档 3:Kerberos 票据问题#

Terminal window
# 在客户端清空票据,制造"看似无凭据"的状态
klist purge
# 制造 SPN 重复(Kerberos 集成认证失败的经典根因)
setspn -S HTTP/oa.qy.net QY\svc_oa
setspn -S HTTP/oa.qy.net QY\svc_oa2 # 重复注册同一个 SPN

现象:交互式登录正常,但 Web 系统的集成认证(SSO)失败——这是”能登电脑、登不上系统”的分水岭。

档 4:缓存凭据 / 本地缓存污染#

Terminal window
# 在客户端制造缓存的旧凭据
cmdkey /add:oa.qy.net /user:QY\zhangsan /pass:OldPwd123!
# 手动清理测试:
cmdkey /list
cmdkey /delete:oa.qy.net

现象:用户”明明密码是对的”,但某个应用始终用缓存的旧密码认证。

档 5:DC 复制不一致 / 站点归属#

Terminal window
# 让某台 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/SSOKerberos / SPNklist、setspn -X(查重复 SPN)
提示”密码已过期”密码过期Get-ADUser -Properties PasswordExpired,pwdLastSet
只有某几个用户有问题,同组其他人正常账号个体问题该用户的属性、组、锁定状态
同一楼层/网段用户都异常,其他正常DC / 站点 / 子网归属nltest /dsgetdc:qy.net、AD 站点与子网配置
所有用户都异常DC 故障 / DNS / 时间DC 可达性、w32tm /monitor
只有某个应用不行,其他都行应用侧缓存凭据 / SPNcmdkey /list、应用日志、SPN
间歇性、重试能进时间偏差 / 复制延迟KRB_AP_ERR_SKEW、repadmin /replsummary

4. 标准排查路径(参考答案)#

第 0 步:三问定方向(最省时间的一步)#

在动手敲命令前,必须问清:

  1. 在哪登录失败?(本机 / Web SSO / VPN / 邮件客户端 / 共享盘) → 判断是”域登录”还是”应用认证”,两者根因库完全不同。
  2. 报什么错?(原样抄下提示,或截图) → “用户名或密码错误” vs “账户已锁定” vs “信任关系失败” 指向完全不同的分支。
  3. 是否只有他一个人?(同部门、同楼层、同网段分别问) → 快速区分”个体问题”和”范围问题”,这一问能砍掉一半排查量。

第 1 步:确认账号状态(最快见效)#

Terminal window
# 账号是否被锁定
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 上。

Terminal window
# 在 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 -AutoSize

Event ID 4740 的 SourceComputer 字段就是锁定发起者的机器名——这就是你要抓的”内鬼”。

找到那台机器后,继续追:

Terminal window
# 在那台机器上查 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 步:区分”域登录失败”和”应用认证失败”#

域登录(能登电脑吗?)

Terminal window
# 客户端上查看当前登录的 DC 和令牌
whoami /all
nltest /dsgetdc:qy.net # 当前用的是哪台 DC
nltest /sc_query:qy.net # 安全通道状态
# Kerberos 票据
klist # 查看是否有 TGT
klist purge # 清空票据后重试(排除票据污染)

应用认证(Kerberos SSO 失败)

Terminal window
# 检查 SPN 是否重复注册 —— SSO 失败的头号根因
setspn -X # 查找重复 SPN
setspn -L svc_oa # 查看某账号注册的 SPN
# 检查委派(若应用需要委派)
Get-ADUser svc_oa -Properties TrustedForDelegation, `
msDS-AllowedToDelegateTo

判据:

  • 能登电脑 + 登不上 SSO → 查 SPN / Kerberos,不要查密码
  • 电脑都登不上 → 查账号状态 / DC / 网络 / 时间

第 4 步:检查复制与 DC 一致性(“重启就好了”型)#

Terminal window
# 复制健康总览
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 步:时间层检查(别忘了老朋友)#

Terminal window
w32tm /monitor /domain:qy.net

Kerberos 容差 5 分钟,超了就报 KRB_AP_ERR_SKEW(见 Topic #1)。 “凭据问题”和”时间问题”症状高度重合,必须交叉排除。

第 6 步:清除客户端缓存凭据#

Terminal window
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}
查当前 DCnltest /dsgetdc:<域>
查安全通道nltest /sc_query:<域>
查 Kerberos 票据klist / klist purge
查重复 SPNsetspn -X
查账号 SPNsetspn -L <账号>
查委派配置Get-ADUser <u> -Properties TrustedForDelegation,msDS-AllowedToDelegateTo
复制健康repadmin /replsummary
对象元数据repadmin /showobjmeta <DC> "<DN>"
缓存凭据cmdkey /list / cmdkey /delete:<目标>
时间偏差w32tm /monitor /domain:<域>

7. 高频根因 TOP 5(实战排名)#

  1. 手机/移动端邮件客户端用旧密码持续认证 → 账号反复锁定 (实战中出现频率最高,且最容易被忽略)
  2. 密码过期 + 老旧应用不提示,直接报”密码错误”
  3. SPN 重复或缺失 → Kerberos SSO 失败
  4. 客户端缓存凭据(凭据管理器 / 映射驱动器 / 计划任务)
  5. 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` → 偏差 ___ ms
7. 【排除项】已确认与以下无关:___
## 三、根因
[一句话,例如:"用户手机上残留的旧邮箱配置持续以旧密码认证,
导致账号每 3 分钟触发一次锁定阈值,表现为'重置密码后短暂可用又复发'"]
## 四、处理动作
1. 止血:`Unlock-ADAccount` 解锁账号
2. 根治:在 ___ 设备/系统上删除/更新旧凭据配置
3. 清理:客户端 `cmdkey` 缓存凭据清理(如有)
4. 验证:用户重新登录测试 ___ 次,成功 ___ 次
## 五、验证结果
- 账号锁定状态持续观察 ___ 分钟无复发
- 4740 事件:处理后 ___ 分钟内无新增
- 用户业务恢复确认:___
## 六、复盘与改进
- 教训:[例如"账号锁定类问题必须先定位锁定源,解锁只是止血"]
- 待办:
- [ ] 整理《用户登录故障分诊表》并分享给服务台
- [ ] 部署账号锁定监控告警(4740 事件触发通知)
- [ ] 梳理域内使用旧凭据的服务/任务清单
- [ ] 推动移动设备邮箱配置的规范化
- [ ] [其他]
## 七、耗时统计
- 现象确认与信息收集:___ 分钟
- 排查定位:___ 分钟
- 处理与验证:___ 分钟
- 合计:___ 分钟

9. 延伸研究方向#

  1. 自动化锁定源分析:写一个脚本,输入用户名 → 自动聚合 4740 + 4625 事件 → 输出”锁定源 TOP 清单”,直接给服务台用。
  2. 细粒度锁定策略:为服务账号设置独立的高阈值 PSO,避免定时任务被误锁。
  3. Kerberos 深入:SPN、委派(约束/非约束/基于资源的 RBCD)、票据生命周期、双跳问题。
  4. 凭据攻击视角:密码喷洒(Password Spray)的特征——大量账号各失败一两次,与”单账号被锁定”模式相反,值得做对比分析。
  5. 旧协议清理:NTLM 依赖排查(与 Topic #1 延伸方向呼应),LDAP 明文绑定的风险。
  6. 自助服务:账号解锁自助门户、密码自助重置(SSPR)的落地与安全边界。
  7. 审计与合规:登录事件的留存周期、取证价值、隐私边界。

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!

打赏
Windows AD 凭据异常导致用户无法登录的排查
https://springtsuki.xucjno.com/posts/springtsuki/notes/windowsad/911-pwd/
作者
SpringTsuki
发布于
2026-09-11
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
SpringTsuki
你好,我是浅月。
公告
浅月的开发小窝!欢迎你来到这里!
音乐
封面

音乐

暂未播放

0:000:00
暂无歌词
分类
标签
站点统计
文章
56
分类
9
标签
42
总字数
188,888
运行时长
0 天
最后活动
0 天前
站点信息
构建平台
GitHub Actions
博客版本
Firefly v6.13.5
文章许可
CC BY-NC-SA 4.0

文章目录