4625 说了什么
登录失败事件记录每一次凭据验证失败的尝试,并给出失败原因码、登录类型、目标账号与来源信息。它是排查「密码明明对却登不上」「账号为什么一直被锁」「有没有人在试密码」这三类问题的核心依据。判断的关键在于把原因码与来源结合起来看:同一个账号在短时间内高频失败且来自同一设备,多半是旧凭据在重试;而大量不同账号从同一地址失败,则更像是在扫描猜密码。
基本信息
| 适用平台 | Windows 客户端与服务器,安全日志默认记录 |
|---|---|
| 日志通道 | 安全日志,读取需要管理员权限 |
| 关键字段 | 状态与子状态码、登录类型、目标账号、来源地址、来源工作站 |
| 状态码作用 | 状态给出通用类别,子状态给出具体原因,两者要一起看 |
| 常见原因 | 密码错误、账号不存在、账号被锁定、时间限制 |
| 分析维度 | 按账号聚合或按来源地址聚合,结论完全不同 |
典型使用场景
- 排查登录失败:确认真实原因是密码错误还是账号被锁
- 账号锁定溯源:找出持续重试的账号与来源设备
- 识别爆破尝试:同一来源对多个账号高频失败
- 验证修复效果:清理旧凭据后确认失败记录不再出现
- 安全巡检:统计失败次数异常增长的账号与来源
- 定位服务账户问题:间歇性失败往往来自服务或计划任务
常用示例
常用示例
# 取最近 24 小时的登录失败事件并整理关键字段
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4625; StartTime=(Get-Date).AddHours(-24)} |
Select-Object TimeCreated,
@{n='账号';e={$_.Properties[5].Value}},
@{n='状态';e={$_.Properties[7].Value}},
@{n='子状态';e={$_.Properties[9].Value}},
@{n='类型';e={$_.Properties[10].Value}},
@{n='来源';e={$_.Properties[19].Value}} |
Format-Table -AutoSize
# 按账号聚合,看哪些账号失败最多
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4625; StartTime=(Get-Date).AddDays(-1)} |
Group-Object { $_.Properties[5].Value } | Sort-Object Count -Descending | Select-Object -First 10 Name, Count
# 按来源地址聚合,判断是否来自同一处
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4625; StartTime=(Get-Date).AddDays(-1)} |
Group-Object { $_.Properties[19].Value } | Sort-Object Count -Descending | Select-Object -First 10 Name, Count常见原因码
| 子状态码 | 含义 | 处置方向 |
|---|---|---|
| 密码错误 | 凭据不匹配 | 核对密码或清理保存的旧凭据 |
| 用户不存在 | 账号名拼写错误或已删除 | 确认账号名与域是否正确 |
| 账户锁定 | 多次失败已触发锁定策略 | 先清来源再解锁,避免复锁 |
| 时间限制 | 不在允许登录的时间窗内 | 核对登录时段策略 |
| 工作站限制 | 不允许从该设备登录 | 核对设备限制策略 |
| 登录类型异常 | 服务使用了交互式登录 | 检查服务账户配置方式 |
状态码与子状态码要一起读:前者是通用类别,后者才是具体原因。只看其中一个容易得出含糊结论,尤其在区分密码错误与账号锁定时。
服务账户造成的失败往往是间歇性的,按时间聚合更容易看出规律——固定间隔出现的失败基本可以判定为计划任务或服务在重试。