VBScriptを掌握せよ:WMIイベントクエリで実現する「ネットワーク切断検知」の極意
現場の自動化エンジニアにとって、もっとも避けるべき悪夢は「ネットワークが切断されていることに気づかず、後続のデータベース処理がタイムアウトし、データの整合性を破壊すること」だ。
ポーリング(一定時間ごとの監視)で `Ping` を打ち続けるような原始的な手法は捨てろ。それはリソースの無駄であり、設計の敗北だ。今回は、WMI(Windows Management Instrumentation)のイベントクエリを駆使し、OSレベルの通知をトリガーにする「真の非同期監視」の技術を伝授する。
—
なぜ「ポーリング」ではなく「イベント監視」なのか
多くの初学者は、`Do…Loop` の中で `Sleep` を入れ、無限に `Ping` を投げ続けるスクリプトを書く。これは以下の理由で「プロのコード」ではない。
1. レイテンシの発生: 検知タイミングがループの周期に依存する。
2. CPUリソースの浪費: 待機中とはいえ、不要な処理がプロセスを占有する。
3. ネットワーク負荷: 不要なパケットを生成する。
我々が採用するのは `__InstanceModificationEvent` だ。WMIの強力なイベントサブシステムを利用し、Windowsがネットワークアダプタの状態変化を検知した「その瞬間」に、スクリプトを呼び出す。これが、極限まで無駄を削ぎ落とした設計だ。
—
堅牢な実装:プロダクション・コード
このコードは、WMIのイベントシンクを利用した非同期監視の雛形である。実務では、この `OnNetworkEvent` プロシージャの中に、ログ出力やDB接続の切断処理を組み込む。
‘ — NetworkMonitor.vbs —
Option Explicit
Dim objWMIService, objEventSource
Dim strQuery
‘ WMIサービスへ接続
Set objWMIService = GetObject(“winmgmts:\\.\root\cimv2”)
‘ Win32_NetworkAdapterのNetConnectionStatusの変化を監視
‘ 2: 接続中, 7: 切断中 など。ステータス変化をキャッチする
strQuery = “SELECT FROM __InstanceModificationEvent WITHIN 5 WHERE ” & _
“TargetInstance ISA ‘Win32_NetworkAdapter’ AND ” & _
“TargetInstance.NetConnectionStatus <> PreviousInstance.NetConnectionStatus”
Set objEventSource = objWMIService.ExecNotificationQuery(strQuery)
WScript.Echo “監視を開始しました…(Ctrl+Cで終了)”
Do
‘ イベント発生までスクリプトを待機させる(CPU負荷はゼロに近い)
Dim objEvent
Set objEvent = objEventSource.NextEvent
‘ ここがトリガーポイント
Call OnNetworkEvent(objEvent.TargetInstance)
Loop
Sub OnNetworkEvent(objAdapter)
Dim status
status = objAdapter.NetConnectionStatus
‘ 実務上のロジックをここに記述
‘ 0:Disconnected, 2:Connected
If status = 0 Then
WScript.Echo Now & ” [ALERT] ネットワーク切断: ” & objAdapter.Name
‘ ここでデータベース接続をクローズする等の安全措置を講じる
ElseIf status = 2 Then
WScript.Echo Now & ” [INFO] ネットワーク接続: ” & objAdapter.Name
‘ ここで自動再接続処理をトリガーする
End If
End Sub
—
設計上の重要原則と注意点
1. 「WITHIN 5」の意味を理解せよ
クエリに含まれる `WITHIN 5` は、ポーリング間隔ではない。イベントの「評価間隔」だ。WMIはOSからの通知を即座に受け取るが、複数のプロパティ変化が短時間に重なった場合のデバウンス(揺らぎ防止)として機能する。`5`秒という数値は、過敏な反応を抑え、かつ実用に耐えうるバランスだ。
2. インスタンスのライフサイクルを制御せよ
このスクリプトをバックグラウンドで常駐させる際、`WScript.exe` を使用すること。`CScript.exe` で実行すればコマンドプロンプトが開きっぱなしになる。`WScript` ならば画面に何も表示されず、バックグラウンドタスクとして静かに動作する。
3. ファイル・DB連携時の「防波堤」
ネットワークが切断された瞬間、オープン中のDBコネクションは「ゾンビ」と化す。これを放置して書き込みを行うと、スクリプトがハングアップする原因となる。
- 原則: ネットワーク切断イベントを検知したら、即座に `Set objConn = Nothing` を実行し、オブジェクトを破棄せよ。
- 復旧: 接続検知イベントが発火した後に、初めて再接続のシーケンスを開始する。この「状態の非同期管理」こそが、業務自動化の堅牢性を担保する要だ。
—
最後に:エンジニアとしての矜持
VBScriptは「古い言語」と揶揄されることがある。だが、Windowsの深い層(WMIやCOM)をこれほど直感的に扱える軽量なツールは他にない。
あなたが書くスクリプトは、単なる自動化ツールではない。ネットワークという不安定なインフラの上で、業務の継続性を守るための「番人」だ。今回伝えたイベント駆動の設計を取り入れることで、あなたのコードは「不安定なスクリプト」から「堅牢なシステムの一部」へと進化する。
さあ、コードを書き換えろ。そして、ネットワークの揺らぎに動じない強靭な自動化環境を構築してほしい。
