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

スポンサーリンク

ネットワークの深淵を覗く:WMIを制御しNICの相関を掌握する極致

システム管理の現場において、WMI (Windows Management Instrumentation) は依然としてレガシー環境の「最後の砦」である。PowerShellが台頭した今なお、VBScriptによるWMI操作は、依存関係のない軽量なインベントリ収集ツールとして、その価値を失っていない。

今回は、単にIPアドレスを拾うだけのスクリプトではない。物理・仮想・論理NICの混在する複雑な環境下で、`Win32_NetworkAdapter` と `Win32_NetworkAdapterConfiguration` を結びつけ、真に有効なMACアドレスとIPの対応表を抽出する、アーキテクトレベルのロジックを伝授する。

—

1. 接続の解像度:なぜWMIクエリを分ける必要があるのか

多くの初学者は `Win32_NetworkAdapterConfiguration` だけを叩いて満足する。しかし、これでは「無効化された仮想スイッチ」や「ゴースト化したドライバ」まで拾い上げ、インベントリを汚染することになる。

真の精緻なインベントリには、以下の二段階のフィルタリングが不可欠だ。

1. 物理的・論理的生存確認: `Win32_NetworkAdapter` の `NetEnabled = True` を確認する。
2. IPバインド確認: `Win32_NetworkAdapterConfiguration` の `IPEnabled = True` を確認し、かつ `SettingID` を介してアダプタと紐付ける。

この「リレーションの整合性」こそが、運用保守の品質を分かつ境界線である。

—

2. 実装:メモリ最適化を意識したインベントリ収集ロジック

VBScriptにおいて最も恐ろしいのは、メモリリークではない。オブジェクトの解放漏れによるプロセス寿命の肥大化である。WMIのオブジェクトは再利用性が低いため、ループ内での明示的な `Nothing` 代入は、大規模環境での実行時に必須の作法だ。

‘ インベントリ収集スクリプト:NetworkInterfaceScanner.vbs
Option Explicit

Dim objWMIService, colAdapters, objAdapter, colConfigs, objConfig
Dim strComputer, strMac, strIP

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

‘ 有効なネットワークアダプタのみを抽出
Set colAdapters = objWMIService.ExecQuery _
(“Select From Win32_NetworkAdapter Where NetEnabled = True”)

WScript.Echo “MAC Address | IP Address”
WScript.Echo “————————–”

For Each objAdapter In colAdapters
‘ 設定情報(Configuration)へのリンクをSettingIDで張る
Set colConfigs = objWMIService.ExecQuery _
(“Select From Win32_NetworkAdapterConfiguration Where SettingID = ‘” & objAdapter.SettingID & “‘”)

For Each objConfig In colConfigs
‘ IPEnabled かつ IPAddress が存在するアダプタのみ出力
If objConfig.IPEnabled Then
If Not IsNull(objConfig.IPAddress) Then
WScript.Echo objAdapter.MACAddress & ” | ” & objConfig.IPAddress(0)
End If
End If
Next

‘ 明示的なオブジェクト解放:再帰的なメモリ消費を抑止する
Set colConfigs = Nothing
Next

‘ 終了処理
Set colAdapters = Nothing
Set objWMIService = Nothing

—

3. シニアエンジニアのための極限の知見

オブジェクトのライフサイクル管理

上記のコードにおける `Set colConfigs = Nothing` は、単なるおまじないではない。WMIクエリが発行されるたびに、WMIプロバイダはCOMインターフェースを介してメモリを割り当てる。ループの中でこれを放置すると、膨大な数のNICを持つサーバー環境では、スクリプト実行中にワーキングセットが膨れ上がり、OSのレスポンスに影響を与える可能性がある。

レガシー環境での罠

  • IPv6の混在: 上記コードでは `IPAddress(0)` としてIPv4を優先的に取得しているが、環境によってはIPv6が先行する場合がある。厳密なインベントリが必要な場合は、`InStr` 関数で “.” が含まれるかを確認する等のバリデーションを追加せよ。
  • 権限の壁: WMIへのアクセスは管理者権限を要求する。タスクスケジューラで実行する際は、「最上位の権限で実行する」にチェックを入れることを忘れてはならない。

—

4. 結びに:自動化の真髄

自動化とは、単に手作業を置き換えることではない。「ノイズのない正確なデータを継続的に取得する仕組み」を構築することである。

今回提示したロジックは、そのまま資産管理システムやCMDBへの連携インターフェースとして機能する。VBScriptという言語は古いかもしれないが、OSの深部にアクセスするそのポテンシャルは、現代のどの高レイヤー言語よりも直感的で強力だ。

現場の課題は、コードの複雑さではなく「いかにノイズを排除し、真実を抽出するか」にある。この知見が、貴殿のインフラ運用における強力な武器となることを確信している。

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