共用方式為


嗨,Scripting Guy!改寫?沒問題!

Microsoft Scripting Guys

本專欄是根據 Windows Vista 的搶鮮版 (Prerelease Version) 而寫成。本文所含的某些資訊有可能變更。

下載本文程式碼: ScriptingGuys2006_11.exe (151KB)

您大概 早已聽聞,在職場上突飛猛進的最佳方式,就是建立網路 (又稱人脈) – 您知道,就是與業界中的其他人士建立關係,如此才能向他們請益、與他們分享資訊,說不定某天還可以被他們網羅聘用。Scripting Guys 從來就沒有真正掌握這個職場人脈的精髓 (這點大概很明顯了),但我們倒是知道一點有關電腦網路的知識。這是因為您可以透過指令碼來進行很多的「網路」作業。

Windows® Management Instrumentation (WMI) 提供幾種課程,您可以用來控制和監視您的網路環境。其中兩種課程,Win32_NetworkAdapter 和 Win32_NetworkAdapaterConfiguration,讓您使用電腦上的網路 (要不然咧?) 介面卡。

我們常聽到的一個問題是:「有什麼方法可以透過指令碼來啟用和停用網路介面卡?」嗯,我們不賣關子。現在就可以告訴您,沒有這種方法。至少在您執行 Windows Vista™ 之前是沒有。我們已在 Windows Vista 中的 Win32_NetworkAdapter 類別中新增了兩種方法:Enable 和 Disable。我們馬上就要來看看這些方法,但首先,在您太過沮喪之前,我們要告訴您如何藉由前 Windows Vista 作業系統來執行幾項作業。就當做前菜吧,您將找出電腦上實際可以使用的是什麼網路介面卡 (請參閱 [圖 1])。這內容還不賴,對吧?

Figure 1 尋找網路介面卡

strComputer = "." 
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2") 
Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_NetworkAdapter")

For Each objItem in colItems 
    Wscript.Echo "Name: " & objItem.Name
    Wscript.Echo "Description: " & objItem.Description
    Wscript.Echo
Next

[圖 1] 中,我們一開始要連接至本機電腦上的 WMI 服務。當然,透過 GUI 來找出本機電腦上的網路介面卡並不難,但您要不要使用 GUI 來取得遠端電腦上的網路介面卡資訊看看?這就是這段指令碼和一般 WMI 指令碼的美妙之處:您可以對遠端電腦執行這段指令碼,只要將 strComputer 的值變更為遠端電腦的名稱即可。

在連接至 WMI 服務之後,接下來要查詢 Win32_NetworkAdapter 類別。這個查詢會傳回電腦上所有網路介面卡的集合。之後,我們只需要設定 For Each 迴圈,逐一執行介面卡的集合,然後回報每個介面卡的名稱和描述即可。您的輸出看起來像這樣:

Name: Broadcom NetXtreme 57xx Gigabit Controller
Description: Broadcom NetXtreme 57xx Gigabit Controller

Name: RAS Async Adapter
Description: RAS Async Adapter

Name: WAN Miniport (L2TP)
Description: WAN Miniport (L2TP)

Name: WAN Miniport (PPTP)
Description: WAN Miniport (PPTP)

單單藉由回報 Win32_NetworkAdapter 的不同屬性 (例如 DeviceID、Manufacturer 和 TimeOfLastReset 等),就能擷取網路介面卡的許多相關資訊。如需詳細資訊,請參閱 Script Center 中的下列傑作 Automating TCP/IP Networking on Clients (英文)。

改寫以順應變化

如果是使用 Win32_NetworkAdapter 類別,則只能擷取網路介面卡的相關資訊。如果想要真的變更介面卡的任何設定,則需要使用 Win32_NetworkAdapterConfiguration 類別。這個類別不但能提供介面卡的其他相關資訊 (多虧有了 Win32_NetworkAdpater 所沒有的屬性),還提供數個方法,可讓您依需求來設定網路介面卡。

例如,也許您無法啟用和停用介面卡,但是卻可以在每個具有 TCP/IP 功能的介面卡上,啟用和停用動態主機設定通訊協定 (DHCP)。[圖 2] 所顯示的指令碼會尋找所有具有 TCP/IP 功能的介面卡,然後檢查是否每個介面卡都啟用了 DHCP,並在未啟用時加以啟用。

Figure 2 啟用 DHCP

strComputer = "." 
Set objWMIService = GetObject _
    ("winmgmts:\\" & strComputer & "\root\CIMV2") 
Set colItems = objWMIService.ExecQuery( _
    "SELECT * FROM Win32_NetworkAdapterConfiguration Where IPEnabled = 'True'")

For Each objItem in colItems
    If objItem.DHCPEnabled = False Then
        Wscript.Echo objItem.Caption
        intReturn = objItem.EnableDHCP
        Select Case intReturn
            Case 0
                Wscript.Echo "DHCP enabled"
            Case 1
                Wscript.Echo "You must reboot before DHCP will be enabled"
            Case Else
                Wscript.Echo "Error occurred"
        End Select
        Wscript.Echo
    End If
Next

如同 [圖 1] 中的指令碼,[圖 2] 中的指令碼會連接至本機電腦上的 WMI 服務,然後再查詢 Win32_NetworkAdapterConfiguration 類別。請注意,由於我們只要尋找具有 TCP/IP 功能的介面卡,所以會在查詢中包含 Where 子句:

Where IPEnabled = 'True'

這個子句指定只要尋找 Win32_NetworkAdapterConfiguration 類別的執行個體 (其中 IPEnabled 屬性為 True,代表與該執行個體相關之介面卡具有 TCP/IP 功能)。

接下來要使用 For Each 迴圈,在查詢所傳回的介面卡集合中重覆。首先要在迴圈內部檢查每個介面卡的 DHCPEnabled 屬性。如果該屬性設定為 False,代表未啟用 DHCP,若是如此就要加以啟用。啟用方法是呼叫介面卡物件上的 EnableDHCP 方法。就是這麼簡單!

為了讓您能夠更清楚地觀察指令碼進行的作業,我們會回報 Caption 屬性,以瞭解使用的是哪些介面卡。我們也會包含 Select Case 陳述式,並為使用者建立每項可能結果的描述元。EnableDHCP 方法會在結束後傳回整數值。0 的值表示該方法已成功執行,而且 DHCP 已啟用。1 的值則表示該方法已成功執行,但需要重新啟動電腦,變更才會生效。任何其他的值均表示發生某項錯誤,DHCP 未能啟用。Select Case 陳述式會用來檢查這些整數值,並傳回適當的訊息。

您也可以停用 DHCP;這項作業可藉由設定靜態的 IP 位址並在介面卡上設定子網路遮罩來完成 (請參閱 [圖 3])。

Figure 3 設定 IP 位址

arrIPAddress = Array("192.168.0.12")
arrSubnetMask = Array("255.255.255.0")

strComputer = "." 
Set objWMIService = GetObject _
    ("winmgmts:\\" & strComputer & "\root\CIMV2") 
Set colItems = objWMIService.ExecQuery( _
    "SELECT * FROM Win32_NetworkAdapterConfiguration Where IPEnabled = 'True'")

For Each objItem in colItems
    If objItem.DHCPEnabled = True Then
        Wscript.Echo objItem.Caption
        intReturn = objItem.EnableStatic(arrIPAddress, arrSubnetMask)
        Select Case intReturn
            Case 0
                Wscript.Echo "Static address assigned"
            Case 1
                Wscript.Echo "You must reboot before the static address will take effect"
            Case Else
                Wscript.Echo "Error occurred"
        End Select
        Wscript.Echo
    End If
Next

[圖 3] 中的指令碼幾乎與 [圖 2] 中的指令碼相同,只有幾處重要的差異。指令碼一開始先宣告兩個陣列 (arrIPAddress 和 arrSubnetMask),並為每個陣列指派一個值。然後在 For Each 迴圈中檢查 DHCPEnabled 是否為 True (而不是 False),True 的值表示已啟用 DHCP (也就表示我們要將其停用)。接著要呼叫介面卡物件上的 EnableStatic 方法。您將注意到,與 EnableDHCP 方法不同,EnableStatic 可以使用參數。這些參數是我們稍早所宣告的陣列,其中包含新的靜態 IP 位址和子網路遮罩。

Windows Vista 新增項目

如我們先前所做的承諾 (Scripting Guys 絕對不會食言... 至少很少啦),現在我們要告訴您可以在 Windows Vista 中進行什麼作業。如前所述,在 Windows Vista 中,WMI 類別 Win32_NetworkAdapter 具有兩個新的方法:Enable 和 Disable,您可使用這兩個方法來啟用和停用網路介面卡。還有一個新屬性:NetEnabled;如果介面卡已啟用,此屬性會傳回 True,若沒有啟用則會傳回 False。[圖 4] 顯示的指令碼會尋找電腦上所有停用的網路介面卡,然後將其啟用。

Figure 4 啟用網路介面卡

strComputer = "." 
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2") 
Set colItems = objWMIService.ExecQuery( _
    "SELECT * FROM Win32_NetworkAdapter Where NetEnabled = 'False'")

For Each objItem in colItems 
    Wscript.Echo "Name: " & objItem.Name
    Wscript.Echo "Description: " & objItem.Description
    objItem.Enable
    Wscript.Echo
Next

這幾乎與 [圖 1] 中所示的指令碼相同。(假設您還沒發現的話,我們可是指令碼回收運動的忠實提倡者)。現在要連接至本機電腦上的 WMI 服務,並查詢所有的 Win32_NetworkAdapter 執行個體。由於我們只要尋找停用的介面卡,所以會加入 Where 子句:

Where NetEnabled = 'False'

這個子句使用新增的 NetEnabled 屬性,指定查詢只會傳回 NetEnabled 設定為 False 的介面卡 (也就是網路介面卡停用)。接著再設定 For Each 迴圈,使其逐一查看查詢所傳回的網路介面卡物件集合。在回報介面卡的「名稱」和「描述」後,就呼叫 Enable 方法來啟用介面卡。

很簡單,對吧?但願我們也可以掌握另一種網路關係 (人脈) 的精髓。

Microsoft Scripting Guys Scripting Guys 的老闆是 Microsoft。在打棒球/教棒球/看棒球 (以及其他各種活動) 以外的時間,這些人負責 TechNet Script Center 的運作。請到 www.scriptingguys.com (英文) 一探究竟。

© 2008 Microsoft Corporation and CMP Media, LLC. 保留所有權利;未經允許,嚴禁部分或全部複製.