イベントログをコマンドラインから出力するには、WEVTUTILコマンドを使います。
wevtutil
https://docs.microsoft.com/ja-jp/windows-server/administration/windows-commands/wevtutil
今回は下記の要件でログが必要でした。
・複数サーバを対象に
・昨日と今日の範囲で
作ったバッチの内容がこちら
cd %0~dp
set GMTYear=%DATE:~0,4%
set GMTMonth=%DATE:~5,2%
set GMTDate=%DATE:~8,2%
set /a GMTStart=%GMTDate%-1
set strQuery="*[System[TimeCreated[@SystemTime>='%GMTYear%-%GMTMonth%-%GMTStart%T15:00:00.000Z' and @SystemTime<='%GMTYear%-%GMTMonth%-%GMTDate%T08:00:00.999Z']]]"
REM TargetList.txtはカレントパスに保存する事(内容は「ホスト名 ユーザ名 パスワード」)
for /f "tokens=1-3" %%i in (TargetList.txt) do call :SUB_WEVTUTIL %%i %%j %%k %strQuery%
exit /b 0
:SUB_WEVTUTIL
REM 出力ファイルはリモートサーバ上の指定パスに生成される為注意
wevtutil /r:%1 /u:%2 /p:%3 export-log System C:\%1_sys_%DATE:~5,2%%DATE:~8,2%.evtx /ow:true /q:%4
wevtutil /r:%1 /u:%2 /p:%3 export-log Application C:\%1_app_%DATE:~5,2%%DATE:~8,2%.evtx /ow:true /q:%4
バッチ内で読み込んでいる「TargetList.txt」の中身はこんな感じ。シンプルです。
DBserver foobar\administrator p@ssw0rd
WEBserver1 foobar\administrator p@ssw0rd
WEBserver2 foobar\administrator p@ssw0rd
WEBserver3 foobar\administrator p@ssw0rd
JOBserver hogehoge\administrator abcd12345
変数strQueryには、イベントログ出力の際に指定するフィルタの内容をXPathクエリで記述しています。
日時はGMT表現となる為、JSTとのズレに注意する必要があります。
XPathクエリの記法はよくわかっていないのですが、
一度イベントビューアのGUIでフィルタ指定してXML表示すれば生成可能です。
Excelマクロを、最初にやりたい操作を記録してサンプル構文のように扱うイメージです。
上記の情報は、こちらのサイト様を参考にさせて頂きました。
Always on the clock
また、出力先をC:としていますが、これ実はイベントログ取得対象サーバのパスを示しています。
なので、コマンド実行ホスト上で出力先パスを探してもファイルが見つかりません。
注意点はそんな所かと思います。
イベントログを取るだけなら普通にGUIが提供されていますが。
イベントビューアを開く>別のコンピュータに接続>権限アカウントの指定>目的のログを開く
と、ここでNW越しに大量のログを取得する事になるため、表示されるまでに結構な時間が掛かります。
この作業を多数のサーバを相手に実施するのが非常に面倒だったので、バッチを作ってみました。
バッチといえば、for文からcall :ラベル の形でサブルーチンのように使う事が多いのですが、
遅延展開しなくていいのでデバッグしやすいかなあと思っています。