ネットワークの「優先順位」を支配せよ:VBScriptで挑むWMIによるメトリック制御
こんにちは。自動化の世界へようこそ。
日々、不安定なWi-Fiと有線LANの切り替えにイライラしていませんか?「有線をつないだら、自動的にそちらを優先してほしい」……この切実な願い、実はWindowsの根幹を司るWMI (Windows Management Instrumentation) を叩くことで、VBScriptを使ってスマートに解決できます。
今回は、単なるコードのコピペではなく、なぜその操作が必要なのか、その「魂」の部分まで解説します。これが理解できれば、あなたはもうマクロの記録に頼る初心者ではありません。
—
1. なぜ「メトリック」なのか?
ネットワークの世界には「メトリック値」という指標があります。これは、「どちらの経路を優先して通信に使うか」という重み付けです。
- 有線LAN: 物理的に安定しているため、優先度を高く(メトリック値を小さく)したい。
- Wi-Fi: 予備として使いたいので、優先度を低く(メトリック値を大きく)したい。
Windowsはデフォルトでも自動制御を行いますが、環境によっては意図しない挙動をとることがあります。WMIを通じてこの値を直接操作すれば、ネットワークの主導権を自分の手元に取り戻せるのです。
—
2. 今回の主役:Win32_NetworkAdapterConfiguration
VBScriptでOSの設定を操作する際、最強の武器となるのが「WMI」です。中でも `Win32_NetworkAdapterConfiguration` は、ネットワークアダプタのIP設定を司る心臓部です。
準備するもの
- テキストエディタ(メモ帳でもOKですが、VS Code推奨)
- 管理者権限のコマンドプロンプト(設定変更には権限が必須です)
—
3. 実践:ネットワーク優先度一括設定スクリプト
以下のコードを `SetNetworkPriority.vbs` として保存してください。
‘ — ネットワーク優先度自動調整スクリプト —
‘ 管理者権限で実行してください
Set objWMIService = GetObject(“winmgmts:\\.\root\cimv2”)
‘ IPが有効なアダプタのみを抽出(IPEnabled = True)
Set colAdapters = objWMIService.ExecQuery(“SELECT FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True”)
For Each objAdapter In colAdapters
‘ アダプタの名称で判別(環境に合わせて書き換えてください)
If InStr(objAdapter.Description, “Ethernet”) > 0 Then
‘ 有線LANの場合:優先度を高く(メトリック 10)
errResult = objAdapter.SetIPConnectionMetric(10)
WScript.Echo “有線LANを設定しました: ” & errResult
ElseIf InStr(objAdapter.Description, “Wi-Fi”) > 0 Then
‘ Wi-Fiの場合:優先度を低く(メトリック 20)
errResult = objAdapter.SetIPConnectionMetric(20)
WScript.Echo “Wi-Fiを設定しました: ” & errResult
End If
Next
WScript.Echo “処理が完了しました。”
—
4. 知的エンジニアとしての「重要ポイント」
このスクリプトを読み解く上で、3つの壁を越える必要があります。
① `GetObject(“winmgmts:…”)` の意味
これはOSの「管理窓口」を呼び出していると考えてください。`\\.\root\cimv2` はWindowsの管理情報が集まるデータベースです。ここに対して「SQLのような言語(WQL)」で問い合わせを行っています。
② 管理者権限の壁
WMIで設定変更を行うということは、Windowsのシステム設定を書き換える行為です。スクリプトをダブルクリックして動かない場合は、コマンドプロンプトを「管理者として実行」し、以下のように叩いてください。
`cscript //nologo SetNetworkPriority.vbs`
③ `InStr` による柔軟な判別
なぜ `Description` を使っているのか?それは、PCごとにアダプタの名称(Intel Ethernet, Realtek Wi-Fiなど)が異なるからです。`InStr` 関数で「”Ethernet”という文字が含まれていれば有線」と判定することで、ハードウェア構成が変わっても動く堅牢なスクリプトになります。
—
5. 陥りやすい罠:エラーコードの読み方
もし実行して `errResult` が `0` 以外を返したら、それは「設定に失敗した」というサインです。
- 0: 成功
- 67: 不正なメソッド呼び出し(権限不足が多い)
- 70: アクセス拒否(管理者権限で実行していない)
このエラーコードを読み解く姿勢こそが、自動化エンジニアへの第一歩です。
最後に
VBScriptは「古い」と言われることもあります。しかし、OSの深淵に直接アクセスできるその軽快さと汎用性は、現代のどの高級言語にも負けない武器です。
まずはこのスクリプトをあなたの環境に合わせて書き換えてみてください。それができたら、あなたはもう「自動化」という魔法を使えるエンジニアの仲間入りです。次は、このスクリプトをタスクスケジューラに登録し、PC起動時に自動実行させてみるのはいかがでしょうか?
もし分からないことがあれば、いつでも聞いてくださいね。応援しています!
