web-dev-qa-db-ja.com

powershell Get-WinEventコマンドレット:タイムスタンプでフィルタリングしても、目的の結果が得られませんか?

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が異常動作して信頼できない結果を生成する前にフィルター処理できるログの数に制限はありますか?

4
red888

誰かが別のフォーラム-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) &lt;= 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についてイベントを知らなかったので、ドキュメントをもっとよく調べなければなりませんでした。これからも使ってみたいと思います。

3
red888