Windowsイベントログをコマンドでエクスポートする
Windowsイベントログをコマンドでエクスポートするのは、一定の需要があるようなので調べてみた。
エクスポートは、あとからイベントビューアで読み込めるevtx形式で行う前提。
1. PowerShellの場合
まず何かと便利なPowerShellで調べてみると、Get-EventLogまたはGet-WinEventコマンドレットが使えそうな空気を醸し出すが、evtx形式でのエクスポートには対応していない。
標準出力をCSVやXMLに整形してファイルに保存する方法はいくつか見当たるが。。
ヘルプはこちら。 Get-WinEvent
-ComputerNameや-Credentialを指定することで他のマシンのログも取得できるようなので、そこは利点。
-Pathでevtxファイルを指定すれば、ファイルから読み取ることも可。
フィルタには、ある程度のところまで-FilterHashTableでフィルタして負荷を減らしつつ、Where-Objectで絞り込むのが吉と思われる。
# Systemログからログレベル「重大」、イベントID 10116 をフィルタ後、「keyword」を含むメッセージで絞り込む Get-WinEvent -FilterHashtable @{LogName='system';Level=1;ID=10116} | Where-Object{ $_.Message -match "keyword" }
2. コマンドプロンプトの場合
wevtutilコマンドでevtx形式のエクスポートができる。
wevtutil export-log [イベントログの種類] [エクスポート先ファイルパス] rem 例)wevtutil export-log system System.evtx
ヘルプはこちら。 Wevtutil
全件保存なら何も難しくないが、フィルタしようとすると/q: <Query>
という形でXML Filterっていう面倒なクエリを書かないといけない*1ので、
フィルタするならevtx形式保存はあきらめて、後からGet-WinEventでフィルタしてテキスト保存するほうが楽か。
ログレベルやイベントIDでのフィルタくらいならそれほど難しくはないけれど、面倒なのに変わりはない。
rem ログレベルを指定して保存 重大:1 エラー:2 警告:3 情報:4 wevtutil export-log system System.evtx /q:"*[System[Level = 2]]" rem イベントID 7031 だけを保存 wevtutil export-log system System.evtx /q:"*[System[EventID = 7031]]" rem AND条件 wevtutil export-log system System.evtx /q:"*[System[(Level = 2) and (EventID = 7031)]]" rem OR条件 wevtutil export-log system System.evtx /q:"*[System[(Level = 1 or Level = 2)]]"
まとめ
- evtx形式で保存したい → wevtutilコマンドを使って全件保存。フィルタしたいならXMLクエリを頑張って書く。
- evtx形式にはこだわらない。むしろ楽にフィルタしたい → Get-WinEvent