【入門編】【ネットワークルート自動切り替え】WMI (Win32_IP4RouteTable) を操作したマルチホーム環境の優先メトリック変更 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

こんにちは。自動化の世界へようこそ。
現場で泥臭く、しかし誰よりもスマートにシステムを操りたいと願うあなたへ。今日は、VBScriptの真骨頂とも言える「WMIによるネットワーク制御」という、少しだけ背伸びした、けれど最高にエキサイティングな領域へ案内します。

マクロの記録ボタンを押すだけの「作業者」から、OSの深淵を制御する「エンジニア」へ。その第一歩をここで踏み出しましょう。

なぜVBScriptでネットワークを制御するのか?

現代のWindows環境において、有線LAN(Ethernet)と無線LAN(Wi-Fi)が混在するマルチホーム環境は当たり前です。しかし、PCは時として「遅い回線」を掴んだまま離さないことがあります。

これを力技で制御するのが、Windows管理の要である WMI (Windows Management Instrumentation) です。VBScriptは、このWMIを最も軽量かつ直接的に叩ける言語の一つ。インストール不要、コンパイル不要、メモ帳一つでOSを支配下に置ける――この「軽さ」こそが、自動化エンジニアの武器なのです。

ネットワークの優先順位を操る「メトリック」の正体

ルーティングテーブルには「メトリック」という値があります。これは「その経路を使うためのコスト(重み)」です。数値が小さいほど優先度が高くなります。

今回は、特定のインターフェースのメトリック値をVBScriptで書き換え、通信経路を強制的に切り替えるロジックを組んでいきます。

実践コード:ルートメトリックの動的変更

以下のコードは、指定したネットワークインターフェースのルートメトリックを書き換えるためのテンプレートです。

‘ — WMI経由でルートメトリックを変更するスクリプト —
Option Explicit

‘ 変更対象のインターフェースインデックスと、設定したいメトリック値
Dim targetIndex, newMetric
targetIndex = 12 ‘ ここは環境に合わせてコマンド(route print)で確認してください
newMetric = 10 ‘ 小さいほど優先されます

Set objWMIService = GetObject(“winmgmts:\\.\root\cimv2”)

‘ Win32_IP4RouteTable から指定したインデックスのルートを抽出
Set colRoutes = objWMIService.ExecQuery _
(“Select From Win32_IP4RouteTable Where InterfaceIndex = ” & targetIndex)

For Each objRoute In colRoutes
‘ メトリック値を更新
objRoute.Metric1 = newMetric

‘ 変更をシステムに反映(Putメソッド)
errResult = objRoute.Put_

If errResult = 0 Then
WScript.Echo “成功: インターフェース ” & targetIndex & ” のメトリックを ” & newMetric & ” に変更しました。”
Else
WScript.Echo “エラー: 変更に失敗しました。権限を確認してください。”
End If
Next

初学者がハマる「3つの落とし穴」

VBScriptを触っていると、必ずと言っていいほど以下の壁にぶつかります。これを覚えておくだけで、周囲のエンジニアより一歩リードできます。

1. 権限(昇格)の壁

WMIでOSのネットワーク設定を書き換える行為は、管理者権限が必須です。スクリプトをダブルクリックするだけでは「アクセス拒否」になります。

  • 解決策: コマンドプロンプトを「管理者として実行」してから `cscript.exe script.vbs` と入力して実行する癖をつけましょう。

2. インデックスの固定概念

`InterfaceIndex` は再起動やネットワークアダプタの脱着で変わることがあります。

  • 知見: `Win32_NetworkAdapter` と `Win32_IP4RouteTable` を突き合わせて、名前(例:”Wi-Fi”)から現在のIndexを動的に取得するロジックを組むのが、プロの自動化です。

3. WMIの「Put_」メソッドの重み

WMIオブジェクトの変更は、単なる変数への代入ではありません。`.Put_` を呼び出した瞬間、OS内部のレジストリやカーネルレベルのルーティングテーブルに書き込みが行われます。

  • 注意: ループ処理の中で闇雲に `Put_` を呼ぶと、OSが悲鳴を上げます。変更が必要な時だけ書き換える、という「変化検知」のロジックが重要です。

先輩からのアドバイス:ここをクリアすれば「一人前」

VBScriptは古い言語だと言われますが、「OSの仕様(WMI)を理解して制御する」という本質は、PowerShellであれPythonであれ全く同じです。

まずはこのコードを書き写し、自分の環境の `targetIndex` を特定し、メトリックが変わる瞬間を目撃してください。その時、画面の向こう側のOSが、あなたの書いたコードに従って通信経路を変えた――その感覚こそが、業務自動化エンジニアとしての最初の快感です。

次は、これを「Wi-Fiが切れたら有線に切り替える」という監視ループの中に組み込んでみましょう。そうすれば、あなたはもう立派な自動化の設計者です。

迷ったら、またいつでもここへ戻ってきてください。準備はいいですか? さあ、コードを書き始めましょう。

タイトルとURLをコピーしました