【VBScript極限道】WMIイベント監視で「システムの変化」を瞬時に捉える
こんにちは。自動化の現場で血の通ったコードを書き続けてきたアーキテクトです。
「マクロの記録」という温室から抜け出し、Windowsという巨大なOSそのものを手懐けたいと思っているあなたへ。今日は、VBScriptが持つ真のポテンシャル、「WMI(Windows Management Instrumentation)によるリアルタイム監視」の世界へ招待します。
多くの初心者は「VBScript=単なるバッチ処理」と考えがちですが、実は違います。WMIを使えば、Windowsで起きる「イベント」を、まるでガードマンのように監視し続けることができるのです。
なぜ「ポーリング(ループ監視)」ではなく「イベント駆動」なのか
多くの初学者は、タイマーで「1分ごとにログを確認する」という非効率なコードを書きがちです。しかし、それでは負荷が高い上に、ログが書き込まれた瞬間に反応できません。
ここで登場するのが `ExecNotificationQuery` です。これはOSの深層に「何かが起きたら教えてくれ」と予約を入れる仕組みです。CPUを無駄に回すことなく、イベントが発生したミリ秒単位でコードを叩き起こす。 これが、プロが構築する監視の哲学です。
実装:イベントログをリアルタイムで射抜く
今回は、「失敗ログオン(イベントID: 4625)」を検知して即座にアラートを出すモジュールを構築しましょう。以下のコードを `monitor.vbs` として保存してください。
‘ — WMIイベント監視:リアルタイム・アラート・システム —
Option Explicit
Dim objWMIService, colEvents, objEvent
Dim strQuery
‘ 1. WMIサービスに接続(root\cimv2 名前空間を使用)
Set objWMIService = GetObject(“winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2”)
‘ 2. イベントクエリの構築
‘ Win32_NTLogEventはイベントログを監視するクラスです
strQuery = “SELECT FROM __InstanceCreationEvent WITHIN 5 ” & _
“WHERE TargetInstance ISA ‘Win32_NTLogEvent’ ” & _
“AND TargetInstance.EventCode = 4625”
‘ 3. 非同期イベント通知の登録
Set colEvents = objWMIService.ExecNotificationQuery(strQuery)
WScript.Echo “監視を開始しました…(Ctrl+Cで終了)”
‘ 4. イベント発生まで待機(スレッドをブロックし、通知を待ち受ける)
Do
Set objEvent = colEvents.NextEvent
‘ イベントが検知された瞬間、ここが実行される
WScript.Echo “【警告】失敗ログオンを検知!時刻: ” & Now()
WScript.Echo “詳細: ” & objEvent.TargetInstance.Message
Loop
コードの深層解説:ここが「プロの境地」
1. `WITHIN 5` の意味:
WMIのイベントクエリには、ポーリング間隔を指定する必要があります。`WITHIN 5` は「5秒ごとにOSがイベントを確認する」という意味です。これを小さくしすぎるとOSに負荷がかかり、大きくしすぎると通知が遅れます。5秒がシステム負荷と即時性の妥協点です。
2. `NextEvent` の重み:
このメソッドが呼び出された瞬間、スクリプトの実行は一時停止します。OSから「イベントが来たぞ!」という信号が来るまで、メモリを消費せずに静かに待機するのです。これが、無限ループで `Sleep` を繰り返す素人コードとの決定的な差です。
3. WMIの特権:
`impersonationLevel=impersonate` は、このスクリプトが「OSの権限」を借りて実行されることを意味します。これがなければ、権限不足でイベントログへのアクセスを拒否されます。
陥りやすい罠と対策
- 「実行しても何も起きない」:
WMIクエリは、スクリプト実行時よりも「後」に発生したイベントしかキャッチしません。テストする際は、実際にわざとログインを失敗させてみてください。
- 「管理者権限の壁」:
イベントログの読み取りには管理者権限が必要です。VBScriptを右クリックし、「管理者として実行」することを忘れないでください。
次のステップへ
今回のコードは、単に `Echo` しているだけですが、ここを `Outlook` を起動してメールを送信したり、`Slack Webhook` へJSONを投げたりするように書き換えるだけで、即戦力の監視ツールに化けます。
VBScriptは古い言語だと言われますが、「OSの深層に直接触れ、システムを制御する」という点において、これほど軽量で強力な言語は他にありません。
さあ、マクロの記録から卒業し、OSを支配するエンジニアへの第一歩を踏み出しましょう。何かわからないことがあれば、またいつでも聞いてください。あなたのコードが、現場の安定を支える礎になることを確信しています。
