ネットワークの呼吸を聴け:WMIイベントクエリによる「真のリアルタイム」切断検知
レガシーシステムの深淵で、我々は常に「ポーリング」という悪魔と戦ってきた。`DoEvents`を挟み、`Sleep`でCPU負荷を誤魔化しながら、ネットワークの状態を1秒おきに監視する。そんな泥臭い実装は、もう終わりにしよう。
VBScriptとWMI(Windows Management Instrumentation)を使えば、OSのイベント通知を直接フックできる。OSがネットワークアダプタの状態変化を検知した「その瞬間」に、貴殿のスクリプトを叩き起こす。これが、真に洗練されたシステム管理者の設計思想だ。
なぜ「ポーリング」を捨てるべきか
ネットワークの状態監視において、ループによるポーリングは悪手である。
1. リソースの浪費: 常にCPUサイクルを消費し、バッテリーを削る。
2. 検知の遅延: ポーリング間隔よりも短い瞬断は補足できない。
3. 競合の温床: 状態チェック中に別のプロセスが介入する隙が生まれる。
対して、`WMI Event Query`を用いた非同期監視は、OSのイベントサブシステムに「待機」を委譲する。スクリプト自体はメモリ上に静かに常駐し、イベントが発火した瞬間にのみ処理を実行する。これこそが、VBScriptが持つ本来のポテンシャルだ。
実装:WMI `__InstanceModificationEvent` の真髄
ネットワークアダプタの状態変化を監視するには、`Win32_NetworkAdapter` クラスの変更イベントをキャッチする。ここで重要なのは、`NetConnectionStatus` プロパティの遷移を監視することだ。
以下のコードは、ネットワークの接続・切断を即座に検知し、ログを吐き出す最小構成のテンプレートである。
‘ — NetworkMonitor.vbs —
‘ WMI非同期イベントリスナー:ネットワークアダプタ監視
Option Explicit
Dim objWMIService, objEventSource, objEvent
Dim strQuery
‘ WMI名前空間へ接続
Set objWMIService = GetObject(“winmgmts:\\.\root\cimv2”)
‘ Win32_NetworkAdapterのNetConnectionStatus変化を監視するクエリ
‘ 10秒以内に発生したインスタンスの変更イベントをサブスクライブする
strQuery = “SELECT FROM __InstanceModificationEvent WITHIN 10 ” & _
“WHERE TargetInstance ISA ‘Win32_NetworkAdapter'”
Set objEventSource = objWMIService.ExecNotificationQuery(strQuery)
WScript.Echo “監視を開始しました… (Ctrl+C で終了)”
Do
‘ イベント発生までスレッドをブロック(CPU負荷はゼロ)
Set objEvent = objEventSource.NextEvent
‘ 変更後の状態を取得
Dim objAdapter
Set objAdapter = objEvent.TargetInstance
‘ NetConnectionStatusの意味: 2=接続, 7=切断
If objAdapter.NetConnectionStatus = 2 Then
WScript.Echo Now & ” [INFO] 接続検知: ” & objAdapter.Name
‘ ここに接続時の自動化処理(マウント処理等)を記述
ElseIf objAdapter.NetConnectionStatus = 7 Then
WScript.Echo Now & ” [WARN] 切断検知: ” & objAdapter.Name
‘ ここに切断時のクリーンアップ処理(接続解除等)を記述
End If
‘ メモリリークを防ぐための明示的解放
Set objAdapter = Nothing
Loop
‘ スクリプト終了時のクリーンアップ
Set objEvent = Nothing
Set objEventSource = Nothing
Set objWMIService = Nothing
チーフアーキテクトからの深掘り:保守と最適化の急所
このスクリプトを運用に乗せる際、貴殿が留意すべき「見えないコスト」がいくつか存在する。
1. メモリ管理とオブジェクトのライフサイクル
VBScriptのガベージコレクションを信用してはならない。特に常駐プロセスにおいて、`Set = Nothing` を怠ることは、数日後のメモリリークを約束するようなものだ。オブジェクトをループ内で生成・破棄する場合は、必ずその都度明示的に解放せよ。
2. フィルタリングの精緻化
上記のクエリは「すべてのネットワークアダプタ」を監視する。仮想NICやトンネルアダプタが頻繁に状態を変える環境では、ログが溢れかえる。
`TargetInstance.NetConnectionID` 等でフィルタリングを行い、特定の物理NICのみをターゲットに絞り込むのが賢明だ。
3. セキュリティと権限
WMIイベント監視には管理者権限(Administratorsグループ)が必要となる。タスクスケジューラに登録し、「最上位の権限で実行する」設定を忘れないこと。また、スクリプトの実行ポリシーについては、レガシー環境であれば `cscript` を通じて明示的に実行させるのが定石である。
結論:自動化の本質は「監視」にある
「切断されたらどうするか」という処理の実装よりも、「切断をいかに正確に捉えるか」という土台こそが、システムの堅牢性を決める。ポーリングという古い呪縛から解き放たれた時、貴殿の書くコードは、単なる命令の羅列から、環境と対話する「知的なエージェント」へと進化する。
このWMIイベントクエリの知見を、貴殿のインフラアーキテクチャの礎石として活用してほしい。現場の苦労を知る者こそが、最もエレガントなコードを書けるのだから。
