【ツールの概要】
・イベントログを項目指定して抽出CSVに書き出すスクリプト。
・イベントログのプロパティとGet-Wineventコマンドレットに闇が多すぎて理解しきれてないので、この記事は半分メモを兼ねています。
【環境(使っている環境)】
・Windows server 2016(各文献には2008R2以降と書いてあるっぽい)
・Powershell ver2.0以降?(公式が見当たらないけどおそらく)
【ソース(get_eventlog.ps1)】
$MESSAGES = Get-WinEvent ` -logname security ` -FilterXPath ` "Event [ ` System [ ` Provider [ ` @Name='Microsoft-Windows-Security-Auditing' ` ] ` and ( ` EventID='4624' ` or EventID='4625' ` or EventID='4634' ` ) ` ] ` ]" $MESSAGES | foreach { if ( $_.id -eq "4624" ) { $_ | select timecreated,Id,@{Name="TargetLogonId";Expression={$_.properties[5].value}} } elseif ( $_.id -eq "4625" ) { $_ | select timecreated,Id,@{Name="TargetLogonId";Expression={$_.properties[5].value}} } elseif ( $_.id -eq "4634" ) { $_ | select timecreated,Id,@{Name="TargetLogonId";Expression={$_.properties[4].value}} } } | Export-Csv -Encoding UTF8 -path c:\syslog.csv
【使用方法】
・ソースをメモ帳なりで記述しhoge.ps1で保存します。
・管理者権限でpowershellにて実行します。(イベントログSecurityカテゴリには管理者権限要)
【説明】
・前半のget-wineventでイベントを抽出しMESSAGEに格納しています。
・Microsoft-Windows-Security-Auditingイベントデータをand条件(ここではEventID)で抽出します。他の条件を足すときはandで追加。
・後半のforeachからは変数を展開しています。ここではEventIDでログオンユーザ名のプロパティ位置が変わるため、ifで分岐しています。
・パイプでExportCSVで指定の場所に出力します。(「ConvertTo-Json」とか指定なしで画面出力とかも出来るっぽいです。)
・Windowsイベントログは、イベントビューアの詳細-XMLで確認できる通り大きく2つの項目に分かれていて、
後者「EventData」を取得したい場合は取りたい項目が何番目かを把握していないといけないっぽいですね。
取りたい項目が多い場合は一度全部XMLで取得してから処理なんてのもよいかもです。。
【総評】
参ったのが、これが必要になったけども急ぎの用であまり凝る時間がなかったため、出力されるデータとしてはそっけなくなてしまった点です。
おそらくイベントログのデータはあらかた取れると思うので、例えばログオン試行されたIPアドレスとかも抽出できそうですね。
Windowsのイベントログは通知機能なども付いているので、カスタマイズしたいときとかに使うと吉。
【参考リンク】
Get-WinEvent
Get-wineventで抽出したログから、IDによって参照するフィールドを分けて表示させる方法
PowerShell でイベントログを JSON 出力する - Qiita