strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colNetAdapters = objWMIService.ExecQuery _
("Select * from Win32_NetworkAdapterConfiguration Where IPEnabled=True")
strIPAddress = Array("192.168.1.0")
strSubnetMask = Array("255.255.255.0")
For Each objNetAdapter in colNetAdapters
errEnable = objNetAdapter.EnableStatic(strIPAddress, strSubnetMask)
Next
開始說明此指令碼的作用之前,我們得要先提出嚴正聲明。我們假設 (假設的根據完全是基於您沒有提到其他情況) 您只需要變更 IP 位址;換句話說,我們假設您不需要變更 IP 閘道、不需要變更 DNS 伺服器、不需要變更 WINS 伺服器等等。所有這些動作 (以及其他動作) 都可以使用指令碼來修改,但是我們得花上幾百頁的篇幅來涵蓋所有可能狀況。當然我們也很願意這麼做,只不過傳奇人物 Peter Costantini 已經都幫我們整理好了;詳情請參閱 Peter 的經典大部頭書《自動化用戶端上的 TCP/IP 網路》(英文)。
不,Peter 並沒有雇用任何顧問,雖然他大可這麼做:文章標題完全是他自己想出來的。
真的。
現在回到正題。如同之前說過,這個指令碼又短又簡單。我們開始先連線到遠端電腦上的 WMI 服務,其實使用這段相同指令碼也可以指派新的 IP 位址給遠端機器 (怎麼做?只要把遠端機器的名稱指派至變數 strComputer 即可)。然後使用下行程式碼來傳回電腦上所有已啟用 IP 之網路介面卡的集合:
Set colNetAdapters = objWMIService.ExecQuery _
("Select * from Win32_NetworkAdapterConfiguration Where IPEnabled=True")
另外要注意:這段指令碼假設電腦上只有一個已啟用 IP 的網路介面卡。但是今時今日,機器上很可能安裝不只一個網路介面卡。如果是這種情況,您就應該將這個查詢修改為只傳回將要取得新 IP 位址的網路介面卡。這要怎麼做?簡單的方法是在查詢中指定介面卡 Description:
Set colNetAdapters = objWMIService.ExecQuery _
("Select * from Win32_NetworkAdapterConfiguration Where Description = " & _
"'Broadcom NetLink (TM) Gigabit Ethernet'")
那我們何不一開始就在查詢中使用 Description 屬性?當然可以,只是我們還沒有背熟網路介面卡的描述(說的好:我們腦袋不知道裝了什麼?)有鑑於此,使用 IPEnabled=True 對我們來說比較容易。不過就像之前說的,如果安裝不只一個已啟用 IP 的網路介面卡,這個方法就不管用。您必須自己考慮最適當的作法。
Scripting Guy 的秘訣:當您考慮要怎麼做時,建議您撰寫查詢,然後讓指令碼執行一些無害的動作,例如針對集合中的每個項目回應 Description。千萬不要真的開始變更 IP 位址,除非您已經確定哪些介面卡會受到指令碼影響,而哪些不會。 |
等等,我們說到哪了?對了,這兩行程式碼:
strIPAddress = Array("192.168.1.0")
strSubnetMask = Array("255.255.255.0")
在此我們只是將新的 IP 位址 (192.168.1.0) 指派至名為 strIPAddress 的變數,並將對應的子網路遮罩 (255.255.255.0) 指派至名為 strSubnetMask 的變數。麻煩的部分在於我們必須將這些值指派為陣列;因此要使用 Array 函數。沒錯,我們知道只有一個 IP 位址和一個子網路遮罩。這不是重點;我們還是得將它們設定為陣列,不然指令碼就會失敗。
設定完變數之後,還剩一件事情要做:實際指派新的 IP 位址和子網路遮罩。為此我們設定了 For Each 迴圈對網路介面卡集合重複相同的步驟 (由此可知為什麼集合中只應該有一個這種介面卡),然後呼叫 EnableStatic 方法來指派新的 IP 位址:
For Each objNetAdapter in colNetAdapters
errEnable = objNetAdapter.EnableStatic(strIPAddress, strSubnetMask)
Next
沒錯,非常簡單:只要將這兩個變數 (strIPAddress 和 strSubnetMask) 傳遞給 EnableStatic,我們就大功告成啦。
我們說過,其他一大堆網路介面卡設定都可以使用指令碼來變更。不過,我們要推薦您閱讀 Peter 的白皮書以取得相關資訊。現在我們要打電話叫客房服務,然後再點一盤雪茄和一疊一百元大鈔了。 |