ITを基礎からやってくブログ

とにかく基礎からやってくんです。基礎が大事なんです。

Windowsイベントログをコマンドでエクスポートする

Windowsイベントログをコマンドでエクスポートするのは、一定の需要があるようなので調べてみた。
エクスポートは、あとからイベントビューアで読み込めるevtx形式で行う前提。

1. PowerShellの場合

まず何かと便利なPowerShellで調べてみると、Get-EventLogまたはGet-WinEventコマンドレットが使えそうな空気を醸し出すが、evtx形式でのエクスポートには対応していない。
標準出力をCSVXMLに整形してファイルに保存する方法はいくつか見当たるが。。

ヘルプはこちら。 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