VBScriptでネットワークの「生と死」を監視する:WMIイベントクエリの真髄
こんにちは。システム自動化の深淵へようこそ。
マクロの記録という「安全なゆりかご」から一歩踏み出し、OSの深層に触れたいと考えているあなたへ。今日は、Windows管理の切り札「WMI(Windows Management Instrumentation)」と、その非同期イベント監視の技術を授けます。
LANケーブルを抜いた瞬間、あるいはWi-Fiが途切れたその瞬間に、PCが自律的に反応する。そんな「生きているスクリプト」をVBScriptで実現してみましょう。
—
1. なぜ「ポーリング」ではなく「イベントクエリ」なのか?
初心者の方が陥りがちなのが、「1秒ごとに今の状態を確認する」というループ処理(ポーリング)です。しかし、これはCPUを無駄に浪費し、システム全体のパフォーマンスを低下させる悪手です。
我々プロフェッショナルは、「OSに耳を澄ませる」というアプローチを取ります。
WMIのイベントクエリ(`__InstanceModificationEvent`)を使えば、ネットワークアダプタの状態が変わった「その一瞬」だけ、OSがスクリプトを叩き起こしてくれます。これぞ、リソースを食いつぶさない極限の自動化です。
—
2. ネットワーク監視スクリプトの実装
以下のコードをコピーして、テキストファイルに貼り付け、拡張子を`.vbs`として保存してください。
‘ — NetworkWatcher.vbs —
‘ WMIを使用してネットワークアダプタの接続状態をリアルタイム監視する
Dim objWMIService, colEvents, objEvent
Set objWMIService = GetObject(“winmgmts:\\.\root\cimv2”)
‘ ネットワークアダプタの変更イベントをサブスクライブする
‘ NetConnectionStatusの変更を監視するクエリを定義
Dim strQuery
strQuery = “SELECT FROM __InstanceModificationEvent WITHIN 5 ” & _
“WHERE TargetInstance ISA ‘Win32_NetworkAdapter'”
Set colEvents = objWMIService.ExecNotificationQuery(strQuery)
WScript.Echo “ネットワーク監視を開始しました… (Ctrl+Cで終了)”
Do
‘ イベントが発生するまで、ここで処理を停止(待機)する
Set objEvent = colEvents.NextEvent
‘ 変更前と変更後の状態を比較(NetConnectionStatus)
‘ 2: 接続状態, 7: 切断状態
If objEvent.TargetInstance.NetConnectionStatus <> objEvent.PreviousInstance.NetConnectionStatus Then
If objEvent.TargetInstance.NetConnectionStatus = 7 Then
WScript.Echo “[” & Now & “] 警告: ネットワークが切断されました!”
‘ ここに切断時のトリガー処理を記述
ElseIf objEvent.TargetInstance.NetConnectionStatus = 2 Then
WScript.Echo “[” & Now & “] 情報: ネットワークが接続されました。”
‘ ここに接続時のトリガー処理を記述
End If
End If
Loop
—
3. コードの心臓部を解剖する
- `WITHIN 5`: これは「5秒おきに状態を確認する」という意味ではなく、「最大5秒以内に変化があれば報告せよ」というOSへの指示です。この値を調整することで、検知の精度と負荷のバランスを制御します。
- `ExecNotificationQuery`: これが伝説のメソッドです。一度呼び出すと、スクリプトはイベント待ち状態(ブロック状態)に入ります。CPU負荷はほぼゼロ。これこそがVBScriptの真骨頂です。
- `NetConnectionStatus`: ネットワークアダプタの状態を示すプロパティです。`2`が「接続」、`7`が「切断」を指します。他にも様々な値がありますが、まずはこの2つを覚えるだけで十分です。
—
4. 現場で陥りやすい「罠」
初心者がこのコードで挫折するポイントがいくつかあります。ここをクリアすれば、あなたはもう中級者です。
1. 管理者権限の不足: WMIのイベントサブスクリプションには、高い権限が求められる場合があります。スクリプトを動かす際は、必ず「管理者として実行」したコマンドプロンプトから起動してください。
2. イベントの多発: ネットワークアダプタは、内部で何度も細かい状態遷移を繰り返すことがあります。もし「切断時にメールを送信する」といった処理を行うなら、一度の切断で何度もメールが飛ぶのを防ぐために、「直前の状態を保持するフラグ」を用意するのがプロの流儀です。
3. WScript vs CScript: VBScriptは通常ダブルクリック(WScript)で実行されますが、監視スクリプトはコマンドプロンプト上で動作させるため、`cscript.exe` で実行するのが鉄則です。
:: コマンドプロンプトでの実行例
cscript //nologo NetworkWatcher.vbs
—
最後に:自動化の旅はここから始まる
このスクリプトは、単なるネットワークチェッカーではありません。あなたが「OSと対話」するためのインターフェースです。
この仕組みを理解すれば、USBメモリの挿入検知、特定のプロセスが起動した瞬間の検知、あるいはファイルが作成された瞬間の検知など、応用範囲は無限大に広がります。
VBScriptは古くからある言語ですが、その「OSの深層に触れる力」は、現代のどの高レベル言語にも引けを取りません。ぜひ、このコードをあなたの武器庫に加え、現場の自動化を一歩先へと進めてください。
また何か壁にぶつかったら、いつでもここへ戻ってきてください。準備はいいですか?さあ、コーディングを始めましょう。
