powershell 是 windows 安全事件追踪最直接、最可控的原生工具,支持通过 filterhashtable 精准查询关键事件 id(如 4625、4672、4688、4719、1102),提取结构化字段并集成轻量告警响应。
powershell 是 windows 安全事件追踪最直接、最可控的原生工具。它不依赖第三方软件,能实时访问安全日志、筛选高危行为、导出结构化数据,还能嵌入自动化响应逻辑。
聚焦关键事件 ID,避免信息过载
安全日志每天可能产生数万条记录,盲目拉取全部内容既慢又难分析。应优先监控有明确攻击指向性的事件 ID:
- 4625:登录失败 —— 暴力破解或账号枚举的核心证据,尤其关注 LogonType=3(网络登录)和 LogonType=10(远程交互)
- 4672:特权用户分配特殊权限 —— 可能是提权或横向移动的前兆
- 4688:新进程创建 —— 配合 CommandLine 属性可识别无文件攻击、PowerShell 下载执行等行为
- 4719:审核策略变更 —— 攻击者常先禁用日志记录再行动
- 1102:安全日志被清除 —— 强烈暗示攻击者正在掩盖痕迹
用 FilterHashtable 快速精准查询
这是最常用也最推荐的查询方式,语法清晰、性能稳定、支持本地和远程日志读取:
- 查最近 1 小时内所有 4625 事件:
Get-WinEvent -FilterHashtable @{LogName='Security'; ID=4625; StartTime=(Get-Date).AddHours(-1)} - 查某 IP 地址的失败登录(需解析 Properties):
Get-WinEvent -FilterHashtable @{LogName='Security'; ID=4625} | Where-Object { $_.Properties[18].Value -eq '192.168.1.100' }(索引 18 对应 IP 地址字段) - 同时查多个 ID:
@{LogName='Security'; ID=@(4625,4672,4688)}
提取关键字段并结构化输出
原始事件对象的 Properties 是数组,需按索引定位字段。常见字段索引(以 4625 为例):
- Index 0:Account Name(尝试登录的用户名)
- Index 1:Account Domain(域名)
- Index 5:Logon Type(登录类型,如 3=网络,10=远程桌面)
- Index 18:IP Address(源 IP,仅当 LogonType=3/10 时存在)
- Index 8:Logon Process(如 Advapi、NtLmSsp、Kerberos)
建议封装为自定义对象输出,便于后续筛选或导出 CSV:
$events = Get-WinEvent -FilterHashtable @{LogName='Security'; ID=4625; StartTime=(Get-Date).AddMinutes(-30)} -MaxEvents 100<br>foreach ($e in $events) {<br> [PSCustomObject]@{<br> Time = $e.TimeCreated<br> User = $e.Properties[0].Value<br> Domain = $e.Properties[1].Value<br> LogonType = $e.Properties[5].Value<br> IP = if ($e.Properties.Count -gt 18) { $e.Properties[18].Value } else { 'N/A' }<br> }<br>}搭配简单告警机制实现主动响应
不需要复杂平台,几行脚本就能触发基础响应:
- 发现 5 分钟内同一 IP 出现 10 次 4625,自动发邮件通知管理员
- 检测到 4719 事件,立即记录当前审核策略快照(
auditpol /get /category:* > policy_backup.txt) - 捕获到含可疑关键字(如 “powershell -enc”, “certutil -urlcache”)的 4688 进程命令行,写入警告日志并触发 Windows 通知
注意:生产环境运行前需确认执行策略(Set-ExecutionPolicy RemoteSigned),并避免在高负载服务器上高频轮询(建议最小间隔 30 秒以上)。











