【現場の知見】VBScriptでネットワークを操る!Win32_NetworkAdapterによるNIC制御の極意
こんにちは。自動化の世界へようこそ。
普段、何気なく使っている「ネットワークアダプタ」。これをプログラムから制御できれば、障害時の切り替えや、セキュリティポリシーに基づいた強制的な切断など、インフラ制御の自動化における強力な武器になります。
今回は、VBScriptとWMI(Windows Management Instrumentation)を使い、ネットワークアダプタを自在に有効化・無効化する技術を伝授します。マクロの記録から一歩踏み出し、OSの深層に触れる準備はいいですか?
—
1. なぜ「WMI」を使うのか?
VBScriptでOSの設定をいじるとき、避けて通れないのがWMIです。
WMIは、Windowsのあらゆる管理情報を司る「データベース兼制御センター」のようなもの。`Win32_NetworkAdapter`というクラスを通じて、デバイスマネージャーに表示されるNICの情報にアクセスし、命令を送ることができます。
この技術の注意点(プロの視点)
コードを動かす前に一つだけ。このスクリプトは「管理者権限」で実行する必要があります。 ネットワーク設定というOSの心臓部に触れるため、一般ユーザー権限ではOSに拒絶されます。これはVBScriptのバグではなく、セキュリティ上の仕様です。
—
2. ネットワークアダプタ制御の実践コード
まずは、特定のネットワークアダプタを制御するためのテンプレートコードを提示します。
‘ — NetworkController.vbs —
‘ 特定のネットワークアダプタを有効化/無効化するスクリプト
Option Explicit
‘ 制御したいアダプタの名前(デバイスマネージャーの名称と一致させること)
Dim targetAdapterName
targetAdapterName = “Wi-Fi”
‘ 操作の種類: True=有効化, False=無効化
Dim enableAction
enableAction = False
Call ToggleNetworkAdapter(targetAdapterName, enableAction)
Sub ToggleNetworkAdapter(adapterName, isEnable)
Dim objWMIService, colAdapters, objAdapter, result
‘ WMIサービスへの接続 (root\cimv2名前空間)
Set objWMIService = GetObject(“winmgmts:\\.\root\cimv2”)
‘ 指定した名前のアダプタを検索
‘ NetEnabled = ‘ & isEnable は、現在の状態と逆の状態を探すためのフィルタ
Set colAdapters = objWMIService.ExecQuery _
(“SELECT FROM Win32_NetworkAdapter WHERE NetConnectionID = ‘” & adapterName & “‘”)
If colAdapters.Count = 0 Then
WScript.Echo “エラー: 指定したアダプタ ‘” & adapterName & “‘ が見つかりません。”
Exit Sub
End If
For Each objAdapter In colAdapters
If isEnable Then
result = objAdapter.Enable()
Else
result = objAdapter.Disable()
End If
‘ 0が返れば成功
If result = 0 Then
WScript.Echo “成功: ‘” & adapterName & “‘ の状態を変更しました。”
Else
WScript.Echo “失敗: エラーコード ” & result & ” が発生しました。”
End If
Next
End Sub
—
3. コードのポイント解説
① `GetObject(“winmgmts:\.\root\cimv2”)`
これがWMIへの入り口です。`\\.\`は「自分のPC(ローカルホスト)」を指します。もしネットワーク越しに別PCを操作したい場合は、ここをIPアドレスやコンピュータ名に変えるだけで対応可能ですが、まずはローカルで確実に動かしましょう。
② `ExecQuery` による検索
SQLに似たクエリ言語(WQL)を使って、目的のアダプタを絞り込みます。`NetConnectionID`は、ネットワーク接続一覧画面で表示されている名前のことです。ここが間違っていると何も起きません。
③ `.Enable()` と `.Disable()` の戻り値
メソッドを実行した際の「戻り値」を確認するのは、プロの基本です。
- `0`: 成功
- `5`: アクセス拒否(管理者権限で実行していない可能性大)
- `87`: パラメータエラー
—
4. 陥りやすい罠と対策
罠:アダプタ名が取得できない
`Win32_NetworkAdapter`で取得できる名前は、ドライバ名など様々です。確実に見つけるために、以下のコードで自分のPCのアダプタ名一覧を一度リストアップすることをお勧めします。
‘ 名前確認用スニペット
Dim objWMIService, colAdapters, objAdapter
Set objWMIService = GetObject(“winmgmts:\\.\root\cimv2”)
Set colAdapters = objWMIService.ExecQuery(“SELECT NetConnectionID FROM Win32_NetworkAdapter WHERE NetConnectionID IS NOT NULL”)
For Each objAdapter In colAdapters
WScript.Echo objAdapter.NetConnectionID
Next
罠:非同期実行の壁
ネットワークの切断・接続は、OS側で処理が完了するまでわずかなタイムラグがあります。もし連続して処理を行う場合は、`WScript.Sleep 2000`(2秒待機)などを挟んで、OSの準備ができるのを待つのが堅牢なコードの書き方です。
—
最後に:自動化の先にあるもの
VBScriptは古い言語と言われますが、Windowsの深い階層を叩く能力は、現代の言語にも引けを取りません。
今回学んだ「WMIによる制御」をマスターすれば、ネットワークの切り替えだけでなく、プロセスの強制終了、サービスの状態確認、ディスク容量の監視など、あらゆるインフラ操作をスクリプトで自動化できるようになります。
まずはこのコードをデスクトップに保存し、管理者コマンドプロンプトから `cscript NetworkController.vbs` で実行してみてください。あなたのPCが、あなたの指示一つでネットワークを制御するようになる――その瞬間こそが、エンジニアとしての第一歩です。
何か詰まったら、いつでも聞いてください。コードは裏切りませんよ。
