我正在尝试通过 Get-WinEvent 过滤事件以获取过去 24 小时内的特定日志:
$EventLogFilter = @{logname='ForwardedEvents'; id=4771,4625,4768; StartTime=(Get-Date).AddHours(-24)}
$LogonEvents = Get-WinEvent -FilterHashtable $EventLogFilter
问题是 Get-WinEvent 仅返回 14 个事件,但有数千个事件符合此条件。
例子:
$EventLogFilter = @{logname='ForwardedEvents'; id=4771,4625,4768; StartTime=(Get-Date).AddHours(-24)}
$LogonEvents = (Get-WinEvent -FilterHashtable $EventLogFilter)
$LogonEvents.count
14
现在,如果我从 Get-WinEvent 中删除 StartTime 过滤器并使用 where-object 进行过滤,您就可以看到实际上有多少个这样的事件:
$EventLogFilter = @{logname='ForwardedEvents'; id=4771,4625,4768}
$LogonEvents = (Get-WinEvent -FilterHashtable $EventLogFilter)
($LogonEvents | ?{$_.TimeCreated -ge (Get-Date).Addhours(-24)}).count
19497
所以它错过了近 20,000 个事件日志!到底发生了什么,我是不是在做蠢事,Get-WinEvent 是不是坏了?这个 cmldet 可以过滤的日志数量是否有限制,否则就会出错并产生不可靠的结果?
答案1
有人在另一个论坛上给了我答案 - FilterXML 来拯救我。
下面的内容完全满足了我的需求,并且还增加了让 GUI 为我构建查询的便利:
$FilterXML = '<QueryList>
<Query Id="0" Path="ForwardedEvents">
<Select Path="ForwardedEvents">*[System[(EventID=4771 or EventID=4625 or EventID=4768) and TimeCreated[timediff(@SystemTime) <= 86400000]]]</Select>
</Query>
</QueryList>'
$LogonEvents = Get-WinEvent -FilterXml $FilterXML
$LogonEvents | sort -Property TimeCreated | Select-Object -First 1
执行 ($LogonEvents | sort -Property TimeCreated | Select-Object -First 1) 我能够确认最早的日志正好是 24 小时前的。
我应该多看看文档,因为我根本不知道 -filterxml。我想我从现在开始会用到它。