嗨,Scripting Guy!

Hey,Scripting Guy!

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

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

今天的問題: 如何顯示與特定 MAC 位址關聯的 IP 位址?


如何顯示與特定 MAC 位址關聯的 IP 位址?

嗨,Scripting Guy!如何顯示與特定 MAC 位址關聯的 IP 位址?

-- NK

嗨,NK!回覆您的問題前,咱們先花點時間討論一個相關的問題。經常有人問我們:「如果已知我的網路上有個有 MAC 地址,可不可以透過指令碼得知是哪一台電腦使用這個地址?」 不好意思,我只能這麼回答: 不可能,沒有辦法透過指令碼搜尋網路上的特定 MAC 地址。最多只能繫結到每一台電腦,檢查上面是否有 MAC 地址。例如,您可以透過指令碼從 Active Directory 擷取您所有的電腦名稱,然後想方法連接至每一台電腦,檢查是否能找到 MAC 位址。但我們今天不會討論這種方式。

 

附註: 但您還是可以在指令碼存放庫的 Remote/Multiple Computer Templates (英文) 部分,取得從 Active Directory、文字檔案等其他來源擷取電腦名稱的程式碼範例。


如果您只是希望檢查特定電腦是否具 MAC 地址 (並傳回關聯的 IP 位址),事情就簡單多了:

On Error Resume Next
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery _
    ("Select * from Win32_NetworkAdapterConfiguration Where MACAddress = '99:99:99:AA:99:A9'")
For Each objItem in colItems
    For Each strIPAddress in objItem.IPAddress
        Wscript.Echo "IP Address: " & strIPAddress
    Next
Next

您瞧,一點都不複雜。指令碼一開始先連線到本機電腦上的 WMI 服務 (我們也可以只連線到遠端電腦上的 WMI 服務)。接著再以下面這行程式碼,擷取具有 MAC 地址 99:99:99:AA:99:A9 的所有網路介面卡:

Set colItems = objWMIService.ExecQuery _
    ("Select * from Win32_NetworkAdapterConfiguration Where MACAddress = '99:99:99:AA:99:A9'")

剩下的就是逐一檢查集合資訊,並傳回與該網路介面卡有關的 IP 位址。注意囉,很多人在這裡很容易犯錯:我們要傳回的是每一個網路介面卡的數個 IP 位址。一個網路介面卡當然可能有好幾個 IP 位址,因為 IPAddress 屬性會把值以陣列的型態儲存。所以我們得設定第二個 For Each 迴圈來循環處理這一個回傳的集合。

For Each strIPAddress in objItem.IPAddress
    Wscript.Echo "IP Address: " & strIPAddress
Next

別忘了,就算只有一個 (或跟本沒有) IP 位址,還是得這麼做。

萬一具有特定 MAC 地址的網路介面卡根本不存在,會發生什麼事呢?很簡單,您根本不會收到任何資料。但是我們還要稍微添加一些指令碼,根據集合的 Count 屬性而有所反應: 如果值為 0,表示集合中空空如也,也就是沒有任何網路介面卡具有 MAC 地址。下面修改過的指令碼會在找不到這個介面卡時傳回適當的訊息:

On Error Resume Next
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery _
    ("Select * from Win32_NetworkAdapterConfiguration Where MACAddress = '99:99:99:AA:99:A9'")
If colItems.Count = 0 Then
    Wscript.Echo "There are no adapters with that MAC address."
    Wscript.Quit
End If
For Each objItem in colItems
    For Each strIPAddress in objItem.IPAddress
        Wscript.Echo "IP Address: " & strIPAddress
    Next
Next

反正來都來了,再贈送一些指令碼。這個指令碼會傳回電腦上所有網路介面卡的名稱和 MAC 地址。當然您自己不費吹灰之力就可以寫出來了,我們連吹灰的力氣都替您省了:

strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery _
    ("Select * from Win32_NetworkAdapter")
For Each objItem in colItems
    Wscript.Echo objItem.Name, objItem.MACAddress
Next

如需詳細資訊

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

 

回到頁首 回到頁首