You need to enable JavaScript to run this app. 如何使用Get-WinEvent按Event ID与来源组合过滤归档事件日志
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.29 16:36:07