Share via


嗨,Scripting Guy!

嗨,Scripting Guy!

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

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

今天的問題:如何變更指派給電腦的 IP 位址?


如何變更指派給電腦的 IP 位址?

嗨,Scripting Guy!要如何變更指派給電腦的 IP 位址?

-- RW

RW,您好。老實說,這對 Scripting Guys 來說是個很難回答的問題,但原因並不是因為指令碼很難寫;您馬上就會看到,這段指令碼很簡單。Scripting Guys 之所以覺得困難是因為這需要改變,換做您是 Scripting Guy,您怎麼會想要作任何改變呢?如您所料,我們都開進口跑車、住豪宅,而且拿美金一百元大鈔當火柴來點雪茄。我們有完美無缺的生活嗎?您猜對了:即使是我們的 IP 位址也一樣完美。我們怎麼可能會想要改變 (包括 IP 位址在內) 呢?

附註:好啦,我們承認啦,我們可能有點誇大其詞。實在不好意思承認,不過有時候我們會用十元紙鈔點雪茄。如果前文內容造成您任何不便,Scripting Guys 深感抱歉。


當然啦,我們不像大部分的 Microsoft 員工,Scripting Guys 並非「完全」不食人間煙火:我們也知道世界上有些人的銀行帳戶裡並沒有幾百萬的存款 (也不是說我們真的遇過這些人,只不過我們曾經在電視上看過。至少我們覺得如此;我們會趕快把頻道轉到《指令碼作者名人的上流生活》)。也就是說,對某些人來說,改變是一件好事。不用說,改變 IP 位置更是再好不過:

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 的白皮書以取得相關資訊。現在我們要打電話叫客房服務,然後再點一盤雪茄和一疊一百元大鈔了。


如需詳細資訊

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

 

回到頁首 回到頁首