FilterHashtable 是什么
Get-WinEvent 的 -FilterHashtable 在读取阶段就完成过滤,比先读全部事件再用管道过滤快得多,在安全日志这类体量很大的通道上差别尤其明显。哈希表支持日志名、提供程序、事件 ID、级别、时间范围、关键词、用户等条件自由组合。
基本信息
| 适用平台 | Windows PowerShell 5.1 与 PowerShell 7 |
|---|---|
| 常用键 | LogName、ProviderName、Id、Level、StartTime、EndTime、Keywords、UserID |
| 取值说明 | Id 可传数组一次查多个;Level 1 严重、2 错误、3 警告、4 信息 |
| 时间写法 | StartTime=(Get-Date).AddDays(-1) 这样的相对时间表达式 |
| 结果限制 | -MaxEvents 限制返回条数,避免一次性拉回过多事件 |
| 权限 | 查询安全日志需要管理员权限 |
典型使用场景
- 查最近一天的严重与错误事件,做日常巡检
- 按提供程序过滤某个组件的日志,例如应用程序错误事件 1000
- 统计一段时间内某类事件的条数,判断是否频繁发生
- 按用户或来源筛选登录失败事件,辅助安全排查
- 把筛选结果导出 CSV,作为排障证据留档
常用示例
常用示例
# 最近一天的系统级严重与错误事件
Get-WinEvent -FilterHashtable @{LogName='System'; Level=1,2; StartTime=(Get-Date).AddDays(-1)}
# 按提供程序与事件 ID 过滤
Get-WinEvent -FilterHashtable @{LogName='Application'; ProviderName='Application Error'; Id=1000} -MaxEvents 10
# 查最近两小时的登录成功与失败,并取用户字段
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4624,4625; StartTime=(Get-Date).AddHours(-2)} | Select-Object TimeCreated, Id, @{n='User';e={$_.Properties[5].Value}}
# 列出记录数不为零的通道,确认名称写法正确
Get-WinEvent -ListLog * | Where-Object RecordCount -gt 0常用键与取值
| 键 | 含义 | 说明 |
|---|---|---|
| LogName | 日志通道名 | System、Application、Security 或组件通道全名 |
| ProviderName | 事件提供程序 | 定位组件日志最精确的条件 |
| Id | 事件 ID | 可传数组一次查多个 |
| Level | 级别 | 1 严重、2 错误、3 警告、4 信息 |
| StartTime 与 EndTime | 时间范围 | 用相对时间表达式动态计算 |
哈希表键名拼写错误会直接报错,不会被静默忽略,这一点比返回空结果好排查。字段名以官方文档为准,拼错一定会失败。
-FilterHashtable 的过滤在提供程序侧完成,管道里的 Where-Object 则要先把事件读出来才能过滤。通道里有几十万条记录时,两者的耗时差距会非常明显。