谁最近登录过这台机器是什么
这个场景要回答的是一个常见问题:这台服务器最近有谁登录过。可用的证据是安全日志里的 4624 登录成功事件,按目标用户名聚合就能得到“最近登录榜”。难点在于过滤:机器账户(以 $ 结尾)、SYSTEM、NETWORK SERVICE 这些系统身份会产生海量记录,不过滤的话榜单上全是不会被追责的名字。
基本信息
| 数据来源 | 安全日志中的 4624 登录成功事件 |
|---|---|
| 聚合维度 | 按 TargetUserName 计数并倒序 |
| 过滤要点 | 排除 $ 结尾的机器账户与系统内置账户 |
| 关键补充 | LogonType 区分交互登录与网络登录 |
| 前置条件 | “审核登录”子类别已启用,否则没有事件 |
| 日志滚动 | 安全日志容量有限,久远记录可能已被覆盖 |
排查步骤
- 确认有数据:先确认审核登录已开启,安全日志里有 4624
- 按用户聚合:统计时间窗内每个账号的登录次数
- 排除噪声:过滤机器账户与系统账户,得到人类账号清单
- 看类型:区分交互、远程交互、网络、批处理登录
- 看来源:结合源 IP 与工作站名判断登录来自哪里
- 交叉验证:对可疑账号再看 4634 注销与 4672 特权分配
常用示例
常用示例
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4624; StartTime=(Get-Date).AddDays(-7)} | Where-Object { $_.Properties[5].Value -notlike '*$' -and $_.Properties[5].Value -notin 'SYSTEM','NETWORK SERVICE','LOCAL SERVICE' } | Group-Object { $_.Properties[5].Value } | Sort-Object Count -Descending | Select-Object Count, Name -First 15
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4624; StartTime=(Get-Date).AddDays(-2)} | Select-Object TimeCreated, @{n='账号';e={$_.Properties[5].Value}}, @{n='登录类型';e={$_.Properties[8].Value}}, @{n='来源IP';e={$_.Properties[18].Value}} | Format-Table -AutoSize
wevtutil gl Security # 看安全日志容量与是否覆盖,评估可回溯时间LogonType 与含义
| 类型值 | 含义 | 是否等于有人在机器前 |
|---|---|---|
| 2 | 交互式控制台登录 | 是 |
| 3 | 网络登录(共享、SMB) | 否 |
| 4 | 批处理(计划任务) | 否 |
| 5 | 服务启动 | 否 |
| 7 | 解锁工作站 | 是,需看 4800 配合 |
| 10 | 远程交互(RDP) | 是 |
用户属性里的“最近登录时间”在多域控环境下可能不准确(字段不一定在每个域控上及时复制),要作为证据请以安全日志 4624 为准。
同一账号在短时间内出现大量来自不同工作站的 4624,可能是凭据被用于横向移动的迹象,值得进一步查 4648 显式凭据登录与来源 IP 分布,必要时先冻结该账号。