【入門編】【イベントログ特定ID抽出】WMI Win32_NTLogEvent を用いた特定エラーID・ソースのピンポイント監視と自動集約 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

【VBScript極限攻略】イベントログをWMIで手懐ける!特定ID抽出・自動通知システムの構築

こんにちは。自動化の現場で血と汗を流してきたエンジニア諸君。
今日は「マクロの記録」という温室から一歩踏み出し、Windowsの心臓部に直接メスを入れる技術を授けよう。

Windowsには、何千ものイベントが日々刻まれている。その中から「本当に業務を止めるエラー」だけを嗅ぎ分け、管理者に報告させる。この「WMI (Windows Management Instrumentation) を使ったイベント監視」こそ、VBScriptが今なお現役で輝く理由だ。

さあ、退屈なリファレンスは捨てて、本質を掴む旅に出よう。

—

1. なぜ「WMI」なのか?その本質を知る

Windowsのイベントログを解析する際、初心者は `wevtutil` コマンドの結果をテキストファイルに書き出し、それをVBScriptで読み込むという回り道をしがちだ。しかし、それは効率が悪い。

WMIは「OSが提供するAPIの総合商社」だ。
`Win32_NTLogEvent` というクラスを使えば、ログファイルそのものに触れることなく、クエリ(SQLに似た命令)を投げるだけで、条件に合致したログだけをメモリ上に引き出せる。

WMIの処理フロー

1. Connect: WMIサービスへ接続する。
2. Execute: クエリを投げてデータを取得する。
3. Iterate: コレクション(結果の束)を一つずつ回す。
4. Action: 抽出した情報を整形し、通知または保存する。

—

2. 【実装コード】特定イベントID監視システム

このコードは、指定した「イベントID」と「ソース」が一致するログを過去24時間分抽出するものだ。これをタスクスケジューラに登録すれば、自動監視番人の完成だ。

‘ — 設定エリア —
Const TARGET_ID = 1000 ‘ 監視したいイベントID
Const TARGET_SOURCE = “Application Error” ‘ 監視対象のソース名
‘ ——————

Set objWMIService = GetObject(“winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2”)

‘ WMIクエリ: 特定IDとソースをSQLライクに指定
‘ 実行速度を考慮し、最低限必要なフィールドのみを抽出するのがプロの流儀
strQuery = “SELECT FROM Win32_NTLogEvent WHERE EventCode = ” & TARGET_ID & _
” AND SourceName = ‘” & TARGET_SOURCE & “‘”

Set colLoggedEvents = objWMIService.ExecQuery(strQuery)

If colLoggedEvents.Count = 0 Then
WScript.Echo “異常なし:対象のイベントは検出されませんでした。”
Else
For Each objEvent In colLoggedEvents
‘ 抽出結果を整形して出力
strMessage = “【重要】監視対象イベントを検知しました” & vbCrLf & _
“———————————–” & vbCrLf & _
“ID: ” & objEvent.EventCode & vbCrLf & _
“Source: ” & objEvent.SourceName & vbCrLf & _
“Time: ” & objEvent.TimeWritten & vbCrLf & _
“Message: ” & objEvent.Message

WScript.Echo strMessage
‘ ここでメール送信関数やファイル書き出しを呼び出す
Next
End If

Set colLoggedEvents = Nothing
Set objWMIService = Nothing

—

3. 陥りやすい「落とし穴」を回避せよ

VBScriptで初心者が必ずと言っていいほどハマるポイントが3つある。ここをクリアすれば、もう中級者の入り口だ。

① WMIクエリの「日付」の呪縛

WMIの日付フォーマットは `YYYYMMDDHHMMSS…` という特殊な形式だ。これと比較したい場合は、通常の `Now()` 関数ではなく、`SWbemDateTime` オブジェクトを使う必要がある。面倒かもしれないが、ここを理解すると「過去1時間以内のログ」といった絞り込みが自由自在になる。

② メモリリーク(オブジェクトの解放)

VBScriptはガベージコレクションが強力ではない。`Set obj = Nothing` を忘れると、バックグラウンドでプロセスが残り続け、PCが重くなる。「開いたら閉じる」。これはプログラミングの鉄則だ。

③ 権限の問題

イベントログへのアクセスは管理者権限が必須だ。スクリプトをダブルクリックして動かないときは、「右クリック」→「コマンドプロンプトを管理者として実行」してから `cscript script.vbs` と叩く癖をつけよう。

—

4. 最後に:エンジニアとしての心構え

VBScriptは「古い言語」と揶揄されることもある。しかし、WindowsというOSの深淵をこれほど直感的に扱える言語は、今なお唯一無二だ。

今回紹介したコードは、あくまで「最小構成」だ。ここから先は、君の創造力次第だ。

  • 発展1: 抽出したログをCSVに追記し、Excelでグラフ化する。
  • 発展2: `CDO.Message` オブジェクトを組み込み、SMTPでスマホに直接通知を送る。
  • 発展3: ログの重複を避けるために、一度処理したログのインデックスをローカルに保存する。

「動いた」で満足せず、「どうすればより堅牢で、管理しやすいシステムになるか」を考えてほしい。その一歩が、君をただの作業者から、真の自動化エンジニアへと引き上げるはずだ。

君のコードが、今日も誰かの業務を救うことを願っている。健闘を祈る!

タイトルとURLをコピーしました