【実務・中級編】【ネットワークインターフェース詳細分析】WMI Win32_NetworkAdapterSetting を解析したMACアドレス・IP対応表の自動生成 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

VBScriptを掌握せよ:WMIによるネットワークインベントリ自動化の極意

VBScriptは「古い」と言われる。だが、Windows環境において、余計なランタイムを一切必要とせず、管理者権限さえあれば即座にシステム深部にアクセスできるこの言語は、今なお自動化エンジニアの最強の武器だ。

今回は、多くの情シスや運用担当者が頭を抱える「MACアドレスとIPアドレスの紐付け」を、WMI(Windows Management Instrumentation)を用いて完璧に制御するロジックを伝授する。

なぜ「Win32_NetworkAdapter」だけでは不十分なのか

ネット上のサンプルコードの多くは、単に`Win32_NetworkAdapter`を叩くだけだ。しかし、それでは「物理NIC」「仮想ブリッジ」「VPNアダプタ」「無効化されたゴーストデバイス」が混在し、出力結果はゴミの山となる。

堅牢なインベントリを取得するためには、以下の3階層のフィルタリングが必須だ。

1. 物理的接続状態の確認: `NetConnectionStatus = 2`(接続済み)であること。
2. IPアドレスの実在確認: `Win32_NetworkAdapterConfiguration`にて、IPアドレスが割り当てられていること。
3. 論理結合の照合: `Win32_NetworkAdapterSetting`を用いて、アダプタと設定を正しくリレーションさせること。

これらを怠れば、必ず「IPアドレスが空のNIC」や「仮想ループバックアドレス」に足元をすくわれることになる。

—

実務で通用するプロダクションコード

以下のコードは、単に動くだけではない。エラーハンドリングを意識し、CSVファイルへ直接出力することを想定した設計だ。

‘ — ネットワークインベントリ生成スクリプト —
Option Explicit

Dim objWMIService, colAdapters, objAdapter, objConfig
Dim strComputer, strMAC, strIP, strName
Dim objFSO, objFile

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

‘ 有効なネットワークアダプタのみを抽出
Set colAdapters = objWMIService.ExecQuery _
(“SELECT FROM Win32_NetworkAdapter WHERE NetConnectionStatus = 2”)

Set objFSO = CreateObject(“Scripting.FileSystemObject”)
Set objFile = objFSO.CreateTextFile(“NetworkInventory.csv”, True)
objFile.WriteLine “DeviceName,MACAddress,IPAddress”

For Each objAdapter In colAdapters
‘ Win32_NetworkAdapterSetting を介して設定情報を取得
Dim colConfigs
Set colConfigs = objWMIService.ExecQuery _
(“ASSOCIATORS OF {Win32_NetworkAdapter.DeviceID='” & objAdapter.DeviceID & “‘} WHERE AssocClass = Win32_NetworkAdapterSetting”)

For Each objConfig In colConfigs
‘ IPアドレスが割り当てられているか確認
If Not IsNull(objConfig.IPAddress) Then
strName = Replace(objAdapter.Name, “,”, ” “) ‘ CSV破損防止
strMAC = objAdapter.MACAddress
strIP = Join(objConfig.IPAddress, “|”) ‘ 複数IP対応

objFile.WriteLine strName & “,” & strMAC & “,” & strIP
End If
Next
Next

objFile.Close
WScript.Echo “インベントリ生成完了: NetworkInventory.csv”

—

現場で差がつく設計の要点

1. 「ASSOCIATORS OF」の重要性

WMIのクエリで `ASSOCIATORS OF` を使うことで、アダプタ実体とTCP/IP設定を確実に紐付けられる。単純なJOINよりも高速で、WMIの階層構造を意識した「エンジニアの作法」と言える手法だ。

2. データ整合性の担保

CSVに出力する際、`Replace(objAdapter.Name, “,”, ” “)` を入れている点に注目してほしい。現場で収集したデータが、カンマが含まれるデバイス名によってCSVの列を破壊する事故は後を絶たない。入力値のサニタイズは、自動化の基本中の基本だ。

3. パフォーマンスとリソース管理

VBScriptのオブジェクトは、スコープを抜ければ自動解放されるが、大規模な環境で実行する場合は、あえて `Set obj = Nothing` を明示的に呼び出すスタイルを推奨する。これはメモリリークを防ぐというより、「どのタイミングでリソースを解放したか」をコード上で明確にするための規律だ。

最後に:自動化は「運用」までがセットである

このスクリプトをタスクスケジューラに登録し、ファイルサーバーへ吐き出すだけで、ネットワーク構成の可視化は完了する。

だが忘れないでほしい。自動化ツールは「作って終わり」ではない。OSのアップデートや、仮想化ソフトの仕様変更で、NICの定義は常に揺らぐ。「例外を吐いたときに、どこで落ちたかログに残す」という守りの設計こそが、現場を支える真のエンジニアの証明だ。

さあ、このコードをベースに、君の環境に合わせて改良を加えてみてくれ。健闘を祈る。

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