【実務・中級編】【IP・DNS動的変更】WMI Win32_NetworkAdapterConfiguration を用いたネットワーク設定の自動切り替え – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

ネットワーク設定の動的切り替え:WMIの深淵を制御し、真に堅牢な自動化を実現する

ネットワーク管理の現場において、IPアドレスやDNSの手動設定ほど「退屈で、かつミスが許されない」作業はない。特にモバイルPCを多拠点に持ち込むエンジニアにとって、この切り替えの自動化は必須の要件だ。

多くのチュートリアルでは「動けばいい」というレベルのコードが散見されるが、本番環境でそれを使うのは自殺行為に等しい。本稿では、WMI(Windows Management Instrumentation)の挙動を深く理解し、「失敗しない」「再利用性が高い」プロダクションレベルのVBScript設計を伝授する。

1. WMI操作における「禁忌」と「設計思想」

`Win32_NetworkAdapterConfiguration` を叩く際、初心者はしばしば「設定メソッドを呼べば終わり」と考える。しかし、現実は甘くない。

  • 非同期実行の罠: WMIのメソッド(`EnableStatic`や`SetDNSServerSearchOrder`)は結果を即座に返さないことがある。戻り値のチェックは必須だ。
  • 権限の壁: ネットワーク設定の変更には「管理者権限」が不可欠である。スクリプトが管理者権限で動いているかを冒頭で判定しないコードは、ゴミ箱行きである。
  • インデックスの不確実性: ネットワークアダプタのIDはPCごとに異なる。「何番目のアダプタ」と決め打つのではなく、「特定の名前(例: ‘Wi-Fi’ または ‘イーサネット’)を持つアダプタ」を動的に検索するロジックが必須だ。

2. 堅牢なネットワーク切替スクリプト(プロダクション版)

このスクリプトは、指定したアダプタ名を特定し、IP・ゲートウェイ・DNSを一括で適用する。エラーハンドリングを内包し、設定後の戻り値まで精査する設計だ。

‘ ==============================================================================
‘ ネットワーク設定切替スクリプト (Production Grade)
‘ ==============================================================================
Option Explicit

‘ 設定値
Const ADAPTER_NAME = “Wi-Fi” ‘ 対象となるアダプタ名
Dim IP, Subnet, Gateway, DNS
IP = Array(“192.168.1.50”)
Subnet = Array(“255.255.255.0”)
Gateway = Array(“192.168.1.1”)
DNS = Array(“8.8.8.8”, “8.8.4.4”)

‘ 管理者権限のチェック(実務では必須)
If Not IsAdmin() Then
WScript.Echo “エラー: 管理者権限で実行してください。”
WScript.Quit 1
End If

Call SetNetworkConfig(ADAPTER_NAME, IP, Subnet, Gateway, DNS)

Sub SetNetworkConfig(nicName, ip, mask, gw, dns)
Dim objWMIService, colAdapters, objAdapter, ret

Set objWMIService = GetObject(“winmgmts:\\.\root\cimv2”)
‘ IPEnabled = True のアダプタのみを対象にするのが鉄則
Set colAdapters = objWMIService.ExecQuery(“SELECT FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True”)

For Each objAdapter In colAdapters
‘ 指定した名前と一致するか確認
If InStr(objAdapter.Caption, nicName) > 0 Then
WScript.Echo “対象アダプタを検出: ” & objAdapter.Description

‘ 1. IPとサブネットマスクの適用
ret = objAdapter.EnableStatic(ip, mask)
If ret <> 0 Then WScript.Echo “IP設定失敗: ” & ret

‘ 2. ゲートウェイの適用
ret = objAdapter.SetGateways(gw)
If ret <> 0 Then WScript.Echo “Gateway設定失敗: ” & ret

‘ 3. DNSの適用
ret = objAdapter.SetDNSServerSearchOrder(dns)
If ret <> 0 Then WScript.Echo “DNS設定失敗: ” & ret

WScript.Echo “設定完了。”
Exit Sub
End If
Next
WScript.Echo “エラー: 指定されたアダプタが見つかりません。”
End Sub

Function IsAdmin()
Dim shell : Set shell = CreateObject(“WScript.Shell”)
On Error Resume Next
shell.RegRead “HKEY_USERS\S-1-5-19\”
IsAdmin = (Err.Number = 0)
On Error Goto 0
End Function

3. 実務で「生き残る」ための運用知識

データベース連携のヒント

このスクリプトを単体で使うのは序の口だ。本当の業務効率化は、設定値(IPやDNS)を CSVまたはJSON形式の外部ファイル から読み込むことで完成する。`Scripting.FileSystemObject` を使い、環境ごとの設定ファイルを読み込ませる構成にすれば、PCを何台入れ替えようがスクリプト自体を修正する必要はなくなる。

ログ出力の重要性

本番環境では `WScript.Echo` では不十分だ。重要な処理は必ずログファイルに吐き出せ。エラーコードが「0」以外の場合に、タイムスタンプと共にテキストファイルへ記録するルーチンを追加するだけで、トラブルシュートの工数は劇的に削減される。

なぜ今さらVBScriptなのか?

「今の時代、PowerShellがあるじゃないか」という声が聞こえてきそうだ。確かにその通りだ。しかし、VBScriptはWindows環境であれば何の設定もなしに、どのバージョンのOSでも同じように動く。 環境構築の手間を嫌うレガシーな現場や、極限まで軽量なツールを配布したい場合には、依然として最強の選択肢であることに変わりはない。

最後に:エンジニアとしての矜持

コードを書いて終わりにするな。そのスクリプトは、誰が管理し、何が起きたら失敗と見なすべきか。その「失敗の予兆」をコードに織り込める人間こそが、真の自動化エンジニアだ。

このコードを叩き台に、君たちの現場の要件に合わせて磨き上げてほしい。健闘を祈る。

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