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。這只會傳回有啟用 TCP/IP 的網路介面卡,並且會除去像是 FireWire 連線這樣的東西。
接著建立一個 For Each 迴圈來循環處理所有回傳的集合。在該 For Each 迴圈內,我們將第一個網路介面卡的 IPAddress 屬性值指定到一個名為 arrIPAddresses 的陣列變數 (別被 IPAddress 的名稱給騙了,這個屬性可以包含一個以上的 IP 位址,所以我們才需要用陣列來擷取數值)。我們接著設定第二個 For Each 迴圈來循環處理 IP 位址陣列,我們會檢查每個位址的值看是否符合目標 IP 位址 (192.59.244.247)。如果符合,就將 MACAddress 屬性的值指定給一個名為 strMACAddress 的變數。我們繼續此程序直到檢查完所有網路介面卡的所有 IP 位址為止。
當結束迴圈時,就會知道與目標 IP 位址相關聯的網路介面卡 MAC 位址。信不信由您,這就是解答謎題的關鍵。為什麼?因為兩種 WMI 類別中都可以找到 MACAddress 屬性,知道與 IP 位址 192.59.244.247 關聯的 MAC 位址之後,只要在 Win32_NetworkAdapter 類別中的某處找出相同的 MAC 位址就行了,如此一來,就可以確定與該 IP 位址關聯的網路連線名稱。
這正是我們用第二個 WMI 查詢所做的,它會擷取在 MACAddress 類別的所有執行個體,當中的 MACAddress 等於與我們的 IP 位址關聯的 MAC 位址。
Set colItems = objWMIService.ExecQuery _
("Select * From Win32_NetworkAdapter Where MACAddress = '" & strMACAddress & "'")
放輕鬆,我們就快完成了。我們現在循迴處理回傳的集合,去除任何 NetConnectionID 屬性為 NULL 的執行個體。最後會得到一則像這樣的訊息:
是啦,看起來沒什麼,不過這剛好是與 IP 位址 192.59.244.247 關聯的網路連線名稱,所以至少也值點什麼吧?
順便一提,您可以在《Automating TCP/IP Networking on Clients 》(英文) 白皮書中找到關於使網路連線與網路介面卡相關聯的其他資訊。按一下此連結,然後搜尋「Associating the Network Connections Name with MAC and IP Addresses Using Two Classes」。 |