こんにちは。自動化の現場で修羅場をくぐり抜けてきたエンジニアです。
「オフィスに行くたびにIPアドレスを手動で打ち替える……」。そんな苦行は、今日で卒業しましょう。WMI(Windows Management Instrumentation)を使いこなせば、Windowsのあらゆる設定をコード一つで制御できるようになります。
今回は、VBScriptを使ってネットワーク設定を瞬時に切り替える魔法のスクリプトを授けます。単にコピペするだけでなく、「なぜ動くのか」という本質まで踏み込んで解説しますね。
—
1. なぜ「WMI」なのか?
Windowsの設定変更において、レジストリを直接叩くのは「外科手術」です。失敗すればシステムが壊れます。一方、WMIはOSが公式に用意した「管理用のインターフェース」です。
今回使用する `Win32_NetworkAdapterConfiguration` は、ネットワークアダプタという「ハードウェアの窓口」に対して、OS経由で安全に命令を下すためのクラスです。
2. 実践:IP・DNS自動切り替えスクリプト
以下のコードをコピーし、拡張子 `.vbs`(例: `SwitchNetwork.vbs`)で保存してください。
※注意:このスクリプトはシステム設定を変更するため、必ず「管理者として実行」してください。
‘ — 設定エリア —
strIP = Array(“192.168.1.50”) ‘ IPアドレス
strSubnet = Array(“255.255.255.0”) ‘ サブネットマスク
strGateway = Array(“192.168.1.1”) ‘ デフォルトゲートウェイ
strDNS = Array(“8.8.8.8”, “8.8.4.4”) ‘ DNSサーバー
‘ WMIサービスへの接続
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
‘ 1. IPアドレスとサブネットマスクの設定
errIP = objAdapter.EnableStatic(strIP, strSubnet)
‘ 2. デフォルトゲートウェイの設定
errGW = objAdapter.SetGateways(strGateway, Array(1))
‘ 3. DNSサーバーの設定
errDNS = objAdapter.SetDNSServerSearchOrder(strDNS)
‘ 結果判定
If errIP = 0 And errGW = 0 And errDNS = 0 Then
WScript.Echo “成功: ” & objAdapter.Description
Else
WScript.Echo “エラー発生: ” & objAdapter.Description
End If
Next
—
3. コードの心臓部を解剖する
初学者が必ず迷うポイントを3つだけ解説します。
① `ExecQuery` の罠
`SELECT FROM …` というSQLライクな構文が出てきましたね。これは全アダプタを拾うわけではありません。`WHERE IPEnabled = True` を付けることで、仮想アダプタや無効なアダプタを除外し、「今まさに通信に使っている物理アダプタ」だけを正確に特定しています。ここを省くと、存在しない設定を書き込もうとしてエラーになります。
② なぜ「Array()」を使うのか?
VBScriptのWMIメソッドは、値を一つだけ渡す場合でも「配列(リスト)」を要求することがあります。IPアドレスが一つでも `Array(“192.168.1.50”)` と書くのは、このメソッドが複数のゲートウェイやDNSを受け取れる柔軟な設計になっているからです。
③ エラーの戻り値
`errIP = 0` の `0` は「成功」を意味します。もし `0` 以外の数字が返ってきたら、それは権限不足か、入力したIPが既にネットワーク内で重複している可能性が高いです。
—
4. 現場のプロからのアドバイス
管理者権限の強制
VBScriptはデフォルトでは「標準ユーザー権限」で動きます。このスクリプトをダブルクリックで確実に動かすには、以下のコードをスクリプトの冒頭に追加し、管理者権限で再起動させる「自己昇格」テクニックを使うのが定石です。
‘ 自己昇格コード(冒頭に追加)
If Not WScript.Arguments.Named.Exists(“elevate”) Then
CreateObject(“Shell.Application”).ShellExecute “wscript.exe”, “””” & WScript.ScriptFullName & “”” /elevate”, “”, “runas”, 1
WScript.Quit
End If
最後に
VBScriptは古い言語と言われますが、Windowsの管理という領域において、これほど軽く、インストール不要で強力なツールはありません。
今回学んだ「WMIによる制御」という視点は、将来的にPowerShellやPythonへ移行したとしても、必ずあなたの強力な武器になります。まずはこのスクリプトを自分の環境に合わせて書き換え、自分だけの「自動化ツール」を育ててみてください。
何か詰まったら、いつでも聞いてくださいね。応援しています!
