嗨,Scripting Guy!

嗨,Scripting Guy!

歡迎使用 TechNet 專欄,Microsoft Scripting Guys 會在此為您解答有關系統管理指令碼的常見問題。您有關於系統管理指令碼方面的問題嗎?請將電子郵件傳送到 scripter@microsoft.com。我們無法保證能夠逐一回答每個問題,不過我們會盡力而為。

還有,別忘了瞧瞧全新經過改良的嗨,Scripting Guy!過往文件

今天的問題:如何使網路連線與 IP 位址相關聯?


如何使網路連線與 IP 位址相關聯?

嗨,Scripting Guy!我要如何判斷區域連線是否與特定 IP 位址相關聯?

-- SH

SH,您好。信不信由您,這是相當複雜的程序,原因有二。首先,我們必須使用兩個不同的 WMI 類別 (Win32_NetworkAdapterWin32_NetworkAdapterConfiguration) 來擷取所需的資訊。因為網路連線資訊是儲存在一個類別 (Win32_NetworkAdapter) 中,而 IP 位址則儲存在另一個類別 (Win32_NetworkAdapterConfiguration) 中。除此之外,Windows 把所有的連線,不管是有線連線、無線連線、VPN 連線、FireWire 連接埠,只要說得出來,都當作是網路連線。這表示我們得先費力處理一堆資料之後,才能將特定網路連線連結到特定 ID。

是呀,而且 IP 位址是儲存成陣列。這問題倒不大,不過的確也表示我們多一個困難要解決。

好吧,看大家都這麼同情我們 (「喔,可憐的 Scripting Guys,他們得這麼辛苦地試著回答我們的問題!」),就讓我們來說明一個指令碼,它會回報與 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。這只會傳回有啟用 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」。


如需詳細資訊

查看嗨,Scripting Guy!- 過往文件

 

回到頁首 回到頁首