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が異常動作して信頼できない結果を生成する前にフィルター処理できるログの数に制限はありますか?
誰かが別のフォーラム-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についてイベントを知らなかったので、ドキュメントをもっとよく調べなければなりませんでした。これからも使ってみたいと思います。