イベントログから特定のイベントを抽出する方法として、2003 までは eventquery.vbs を使用していましたが、今の OS では PowerShell で操作することになるかと思います。
# LogParser / Log Parser Studio を使う方法もありますが。
イベントログを操作するコマンドレットとしては、Get-EventLog と Get-WinEvent がありますが、2008 以降のイベントログを操作する場合は、Get-WinEvent を使っていきます。
Get-WinEvent で [FilterHashTable] / [FilterXML] / [FilterXPath] を使うとログをフィルタすることができますが、意イベントログプロバイダーでフィルタする場合、FilterHashTable では、指定したプロバイダーがローカルに存在している必要があるようですので、他の環境から取得したイベントログを使用する場合には、FilterXML / FilterXPath を使うとよいのかと。
# Get-EventLog | Where-Object だとログのサイズが大きいとパフォーマンスがでないので Get-WinEvent でフィルタするとよいかと。
ローカルに存在するイベントログ プロバイダーは
Get-WinEvent -ListProvider * | Out-GridView
で確認できますので、この辺を一度見ておくとよいかもしれないですね。
FilterXPath の条件は、ログをフィルターする際の XML のタブから確認するとよいかと思います。
FilterXPath を使ったログのフィルターは以下のようになるかと。
param( [string]$startdate="2013/12/01" , [string]$enddate="2014/01/11" ) $startdate = [System.TimeZoneInfo]::ConvertTimeToUtc($startdate).ToString("yyyy-MM-ddTHH:mm:ssZ") $enddate = [System.TimeZoneInfo]::ConvertTimeToUtc($enddate).ToString("yyyy-MM-ddTHH:mm:ssZ") $filter=@" *[System [ (Provider[@Name='Microsoft-Windows-GroupPolicy'] and (Level=4) and (EventID=1500) and TimeCreated[@SystemTime>= '$startdate'] and TimeCreated[@SystemTime<= '$enddate']) or (Provider[@Name='Service Control Manager'] and (Level=4) and (EventID=7040) and TimeCreated[@SystemTime>= '$startdate'] and TimeCreated[@SystemTime<= '$enddate']) or (Provider[@Name='volsnap'] and (Level=2) and (EventID=36) and TimeCreated[@SystemTime>= '$startdate'] and TimeCreated[@SystemTime<= '$enddate']) or (Provider[@Name='MSSQLSERVER'] and (Level=4) and (EventID=4193) and TimeCreated[@SystemTime>= '$startdate'] and TimeCreated[@SystemTime<= '$enddate']) ] ] "@ Get-WinEvent -Path C:tempSystem.evtx -FilterXPath $filter -Oldest -ErrorAction SilentlyContinue | Out-GridView
イベントログの日付は UTC で管理されているようですので、日付を変換しています。
イベントログのフィルタから、XPath を生成した場合、以下のようなパスになります。
*[System [ Provider[@Name='ACPI' or @Name='Microsoft-Windows-ActionQueue' or @Name='adpahci'] and (Level=4 or Level=0) and ( (EventID >;= 100 and EventID <= 200) ) ] ]
プロバイダーや ID の条件が AND で繋がれるフィルタになるので、特定のイベントについて ID を指定するため、XPath を少し編集しています。
Get-WinEvent では 2003 までの evt 形式のログも読み込むことができますので、古いサーバーのログをフィルタすることも可能です。
# evt 形式を処理する場合、[-Oldest] のオプションが必須になります。
ただし、evt を Get-WinEvent で処理した場合、メッセージ等は取得できないようですので、イベントの発生を確認するレベルになってしまいますが。この辺の差はイベントログの構造の違いですかね。