
TechNet コラムへようこそ。このコラムでは、よく寄せられるシステム管理スクリプトに関する質問に Scripting Guys がお答えします。システム管理スクリプトについて質問がある場合は、scripter@microsoft.com (英語のみ) までお送りください。すべての質問に回答することはできないかもしれませんが、可能な限り対応いたします。
新しく改良された Hey, Scripting Guy! アーカイブも忘れずにチェックしてください。
今日の質問 : ネットワーク接続を IP アドレスに関連付ける方法はありますか
| Q | Scripting Guy さん、よろしくお願いします。特定の IP アドレスに関連付けられているローカル エリア接続を特定する方法はありますか。 -- SH |
| A | SH さん、こんにちは。信じられないかもしれませんが、この方法は次の 2 つの理由により非常に複雑です。まず、2 つの異なる WMI クラス、Win32_NetworkAdapter と Win32_NetworkAdapterConfiguration を使用して、必要な情報を取得する必要があります。これは、ネットワーク接続の情報が格納されているクラス (Win32_NetworkAdapter) と IP アドレスが格納されているクラス (Win32_NetworkAdapterConfiguration) が異なるためです。さらに、ワイヤード (有線) 接続、ワイヤレス接続、VPN 接続、FireWire ポートと呼ばれているものが、Windows ではすべてネットワーク接続と見なされます。つまり、特定のネットワーク接続を特定の ID にリンクするには、大量のデータを探し回る必要があります。 ああ、そうでした。IP アドレスは配列として格納されています。たいした問題ではないのですが、このハードルも越えなければなりません。 「読者からの質問に身を粉にして挑み、回答している Scripting Guy は大変だな」と同情の気持ちでいっぱいになっていただいたところで、IP アドレス 192.59.244.247 に関連付けられているネットワーク接続を報告するスクリプトをお見せします。
strComputer = "."
strTargetAddress = "192.59.244.247"
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery _
("Select * From Win32_NetworkAdapterConfiguration Where IPEnabled = True")
For Each objItem in colItems
arrIPAddresses = objItem.IPAddress
For Each strAddress in arrIPAddresses
If strAddress = strTargetAddress Then
strMACAddress = objItem.MacAddress
End If
Next
Next
Set colItems = objWMIService.ExecQuery _
("Select * From Win32_NetworkAdapter Where MACAddress = '" & strMACAddress & "'")
For Each objItem in colItems
If Not IsNull(objItem.NetConnectionID) Then
Wscript.Echo objItem.NetConnectionID
End If
Next
変数 strComputer と strTargetAddress (それぞれ、作業中のコンピュータと調査対象の IP アドレスを示します) に値を代入した後で、WMI サービスにバインドします。その後、ExecQuery メソッドを使用して、Win32_NetworkAdapterConfiguration クラスのうち IPEnabled プロパティが True であるすべてのインスタンスを選択します。このスクリプトは、FireWire 接続などを除いた TCP/IP 対応のネットワーク アダプタのみを返します。 次に、For Each ループを設定して、このコレクションをループします。この For Each ループの中で、最初のネットワーク アダプタの IPAddress プロパティの値を配列変数 arrIPAddresses に代入します (IPAddress という名前に惑わされないようにしてください。このプロパティには複数の IP アドレスを指定できます。したがって、値を配列で取得する必要があります)。次に、2 番目の For Each ループを設定して、IP アドレスの配列をループします。IP アドレスごとに、値が調査対象の IP アドレス (192.59.244.247) と一致するかどうかを確認します。一致していた場合、MACAddress プロパティの値を変数 strMACAddress に代入します。すべてのネットワーク アダプタのすべての IP アドレスを確認するまでこの処理を繰り返します。 ループを終了するときには、検索対象の IP アドレスに関連付けられたネットワーク アダプタの MAC アドレスがわかります。意外なことに、今回の謎を解く鍵はここにあります。なぜでしょう。それは MACAddress プロパティがどちらの WMI クラスにもあるからです。IP アドレス 192.59.244.247 に関連付けられている MAC アドレスがわかったら、後は Win32_NetworkAdapter クラスのどこかにある、それと同じ MAC アドレスを検索するだけです。その結果、IP アドレスに関連付けられているネットワーク接続の名前を特定できます。 この操作を行っているのが 2 番目の WMI クエリで、Win32_NetworkAdapter クラスの中で、検索対象の IP アドレスに関連付けられている MAC アドレスと一致する MACAddress を持つすべてのインスタンスを取得しています。
Set colItems = objWMIService.ExecQuery _
("Select * From Win32_NetworkAdapter Where MACAddress = '" & strMACAddress & "'")
肩の力を抜いてください。もうすぐ完成です。クエリから返されたコレクションをループして、そこから NetConnectionID プロパティが null であるインスタンスを除外します。最終的に次のようなメッセージが表示されます。 ![]()
ちなみに、ネットワーク接続とネットワーク アダプタの関連付けの詳細については、ホワイトペーパー「Automating TCP/IP Networking on Clients」 (英語) を参照してください。リンクをクリックし、「Associating the Network Connections Name with MAC and IP Addresses Using Two Classes」を検索してください。 |
Hey, Scripting Guy! - アーカイブもチェックしてください。