如何使用Get-WinEvent按Event ID与来源组合过滤归档事件日志
实现绑定来源的事件过滤逻辑
原代码存在的问题
当前写法是全局匹配指定事件ID做排除,无差别过滤所有来源产生的同ID事件,会把不属于目标来源的合法事件误删除,完全达不到「仅排除特定来源下指定ID」的需求;同时多段连续的Where-Object写法冗余度高,长日志场景下执行效率低。
核心过滤逻辑
把原有的“单维度ID匹配排除”改成组合维度判断:
- 提前梳理需要排除的规则集合,每条规则同时绑定「要排除的事件ID清单」+「对应的目标来源(ProviderName)」
- 遍历日志事件时,只有当事件同时满足「ID在规则排除清单内」+「来源与规则指定的来源一致」两个条件时,才将该事件排除,其余事件全部保留
可直接复用的查询代码
# 定义排除规则,可根据实际需要追加多组不同来源、不同ID的规则 $excludeRules = @( @{ IdList = @(4, 36, 1111, 2004, 10010, 15300, 15301) ProviderName = "替换为你要匹配的具体来源名称,例如Microsoft-Windows-DistributedCOM" } ) # 查询归档日志并执行组合过滤 Get-WinEvent -Oldest -FilterHashtable @{ Path = "20210317_system - Copy.evt" Level = 2,3 } | Where-Object { $currentEvent = $_ # 判断当前事件是否命中任意一条排除规则 $matchExcludeRule = $excludeRules.Any({ param($rule) $currentEvent.Id -in $rule.IdList -and $currentEvent.ProviderName -eq $rule.ProviderName }) # 保留未命中排除规则的事件 -not $matchExcludeRule }
调整说明
- 事件对象的
Id属性本身为整数类型,不需要像原代码那样转成字符串做比对,直接整数匹配性能更高 - 如果需要模糊匹配来源名称,可将来源匹配的
-eq替换为-like "*关键字*"实现 - 如果后续需要给其他来源配置单独的排除ID清单,直接在
$excludeRules数组中追加对应规则对象即可,不需要新增连续的Where-Object判断 - 若使用的PowerShell版本过低不支持
.Any()方法,可将判断逻辑替换为兼容性更好的循环写法:
$isExcluded = $false foreach ($rule in $excludeRules) { if ($currentEvent.Id -in $rule.IdList -and $currentEvent.ProviderName -eq $rule.ProviderName) { $isExcluded = $true break } }
内容的提问来源于stack exchange,提问作者Deepak
相关产品推荐
相关产品推荐

