前言:很多情況下,用戶辦公地點(diǎn)變更涉及到其辦公電腦IP地址變更,同時用戶只是普通用戶權(quán)限,而且不能告訴用戶管理員密碼。通常我們會利用遠(yuǎn)程桌面在電腦還未搬離原地的情況下更改IP,如果用戶操作系統(tǒng)是win2000或者用戶搬遷之前根本未通知網(wǎng)管(別笑,很多企業(yè)很多員工就是這樣,沒把網(wǎng)管放在眼里,有時候我們也不給面子,就讓他們把電腦再搬到我們這里來,我們親自更改),而更多時候我們就得親自過去更改IP了。
前幾日看了一篇文章,有了點(diǎn)兒靈感。經(jīng)過反復(fù)測試發(fā)現(xiàn)基本可行。
實(shí)驗(yàn)環(huán)境:一臺主機(jī)安裝了一個虛擬網(wǎng)卡,初始IP:10.11.12.13 其中10為整個網(wǎng)絡(luò)IP地址頭字段,每臺主機(jī)IP都是10開頭;11代表主機(jī)所在vlan;12.13代表主機(jī)地址。每臺主機(jī)更改IP其實(shí)就是更改vlan字段以及對應(yīng)網(wǎng)關(guān),其它字段不變。為了測試方便,腳本中規(guī)定如果主機(jī)屬于vlan 11,就更改為vlan 35,如果屬于vlan 35,再更改回vlan 11,這樣方便我反復(fù)測試。
解決途徑:普通用戶界面下肯定無法更改IP,所以需要借助runas 命令,但是runas命令需要提示輸入管理員密碼,所以需要事先將密碼寫入腳本中。同時雖然普通批處理腳本可以更改IP,但是無法自動獲取變量,所以需要借助VBS腳本,通過 WMI 類 Win32_NetworkAdapterConfiguration 提供的屬性和方法,獲取當(dāng)前IP,從而得到當(dāng)前vlan和主機(jī)地址。
附
Win32_NetworkAdapterConfiguration IP 地址分配屬性
屬性 | 類型 | 說明 |
DefaultIPGateway | 字符串?dāng)?shù)組 | 計算機(jī)系統(tǒng)使用的默認(rèn)網(wǎng)關(guān)的 IP 地址數(shù)組。 |
DHCPEnabled | 布爾 | 如果是 True,DHCP 服務(wù)器會在建立網(wǎng)絡(luò)連接時自動為計算機(jī)系統(tǒng)分配一個 IP 地址。 |
DHCPLeaseExpires | datetime | DHCP 服務(wù)器為計算機(jī)分配的租用 IP 地址的到期日期和時間。 |
DHCPLeaseObtained | datetime | DHCP 服務(wù)器為計算機(jī)分配的 IP 地址獲得租約的日期和時間。 |
DHCPServer | 字符串 | DHCP 服務(wù)器的 IP 地址。 |
GatewayCostMetric | Uint16 | 用于計算最快、最可靠或最廉價路由的整數(shù)成本躍點(diǎn)數(shù)值(從 1 到 9999)數(shù)組。這個參數(shù)與 DefaultIPGateway 屬性之間存在一一對應(yīng)關(guān)系。 |
IPConnectionMetric (Windows XP 的新增屬性) | Uint32 | 綁定了 IP 的適配器的已配置路由的使用成本;對于 IP 路由表中的路由來說,這是一個加權(quán)值。如果在 IP 路由表中有多個指向目標(biāo)計算機(jī)的路由,將使用躍點(diǎn)數(shù)最少的路由。默認(rèn)值是 1。 |
IPAddress | 字符串 | 與當(dāng)前網(wǎng)絡(luò)適配器相關(guān)的所有 IP 地址構(gòu)成的數(shù)組。 |
IPSubnet | 字符串 | 與當(dāng)前網(wǎng)絡(luò)適配器相關(guān)的所有子網(wǎng)掩碼構(gòu)成的數(shù)組。 |
上表中的所有屬性都是只讀的。類型 uint16 和 uint32 是由強(qiáng)類型編程語言使用的無符號整數(shù)類型;VBScript 可將它們有效地作為整數(shù)進(jìn)行處理。
Win32_NetworkAdapterConfiguration IP 地址分配方法
方法 | 參數(shù) | 說明 |
EnableDHCP | 無 | 為使用這個網(wǎng)絡(luò)適配器的服務(wù)啟用 DHCP。DHCP 允許動態(tài)分配 IP 地址。 |
EnableStatic | IPAddress – 字符串?dāng)?shù)組 SubnetMask – 字符串?dāng)?shù)組 | 為目標(biāo)網(wǎng)絡(luò)適配器啟用靜態(tài) TCP/IP 尋址。這樣便會對此網(wǎng)絡(luò)適配器禁用 DHCP。 |
ReleaseDHCPLease | 無 | 釋放已綁定到啟用了 DHCP 的特定網(wǎng)絡(luò)適配器的 IP 地址。 警告 如果在本地計算機(jī)上啟用 DHCP,該選項會對這個特定的網(wǎng)絡(luò)適配器禁用 TCP/IP。如果您沒有訪問目標(biāo)系統(tǒng)的其他路徑(即另一個綁定 TCP/IP 的網(wǎng)絡(luò)適配器),所有 TCP/IP 通信都會中斷。 |
ReleaseDHCPLeaseAll | 無 | 靜態(tài)方法。釋放已綁定到所有啟用了 DHCP 的網(wǎng)絡(luò)適配器的 IP 地址。 警告 如果在本地計算機(jī)上啟用 DHCP,此選項將終止所有的 DHCP TCP/IP 連接。 |
RenewDHCPLease | 無 | 續(xù)訂啟用了 DHCP 的特定網(wǎng)絡(luò)適配器上的 IP 地址。DHCP 服務(wù)器分配的 IP 地址的租約有一個截止日期;如果客戶端打算繼續(xù)使用分配的 IP 地址,就必須進(jìn)行續(xù)訂。 |
RenewDHCPLeaseAll | 無 | 靜態(tài)方法。續(xù)訂所有啟用了 DHCP 的網(wǎng)絡(luò)適配器的 IP 地址。DHCP 服務(wù)器分配的 IP 地址的租約有一個截止日期;如果客戶端打算繼續(xù)使用分配的 IP 地址,就必須進(jìn)行續(xù)訂。 |
SetGateways | DefaultIPGateway – 字符串?dāng)?shù)組 GatewayCostMetric – unit16 | 指定一個網(wǎng)關(guān)列表,這些網(wǎng)關(guān)用于將數(shù)據(jù)包路由到該網(wǎng)絡(luò)適配器連接的子網(wǎng)以外的子網(wǎng)。該方法僅在網(wǎng)絡(luò)適配器處于靜態(tài) IP 模式時才有效。 |
上表中的所有方法都返回一個正整數(shù):
· | 0 表示成功完成。 |
· | 1 表示成功完成,并需要重新啟動。 |
· | 大于 1 的數(shù)字表示出現(xiàn)了某種問題,方法無法完成。WMI SDK 列出了這些方法的返回值的含義。 |
解決步驟:
1、 建立run.bat
@echo off
ECHO.set sh=WScript.CreateObject("WScript.Shell")>_TEMP.VBS
ECHO.WScript.Sleep 1000 >>_TEMP.VBS
ECHO.sh.SendKeys "runas /env /user:bl\run" >>_TEMP.VBS
ECHO.WScript.Sleep 1000 >>_TEMP.VBS
ECHO.sh.SendKeys " ""wscript //nologo \"".\chgip.vbs\""""" >>_TEMP.VBS
ECHO.WScript.Sleep 1000 >>_TEMP.VBS
ECHO.sh.SendKeys "{enter}" >>_TEMP.VBS
ECHO.WScript.Sleep 5000 >>_TEMP.VBS
ECHO.sh.SendKeys "1234" >>_TEMP.VBS
ECHO.sh.SendKeys "{enter}" >>_TEMP.VBS
start /B cmd.EXE
cscript //nologo _TEMP.VBS
del _temp.vbs
其中 bl\run 為域管理員賬號,1234為要輸入的密碼
在這里遇到的主要問題就是在輸入密碼后,sleep的時間不好掌握,建議不要將管理員密碼設(shè)置過長,否則會出現(xiàn)密碼還未輸入完畢,已經(jīng)執(zhí)行下一條指令(輸入回車),導(dǎo)致密碼輸入錯誤。到現(xiàn)在為止我還沒發(fā)現(xiàn)更好的解決辦法,希望有人可以繼續(xù)研究。
2、 建立chgip.vbs
On Error Resume Next
dim vlan,endip
strComputer = "."
intReboot = 0
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colNicConfigs = objWMIService.ExecQuery _
("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")
For Each objNicConfig In colNicConfigs
WScript.Echo VbCrLf & " Network Adapter " & objNicConfig.Index & _
VbCrLf & " " & objNicConfig.Description & VbCrLf
if left(objNicConfig.IPAddress(i),5)="10.11" Then
vlan=mid(objNicConfig.IPAddress(i),4,2)
endip=mid(objNicConfig.IPAddress(i),6,len(objNicConfig.IPAddress(i))-5)
arrIPAddresses = Array("10.35" & endip)
arrSubnetMasks = Array("255.255.0.0")
arrGateWays = Array("10.35.1.254")
WScript.Echo " 網(wǎng)絡(luò)地址更改中......"
intReturn = objNicConfig.EnableStatic(arrIPAddresses, arrSubnetMasks) + objNicConfig.SetGateways(arrGateWays)
If intReturn = 0 Then
strIPAddresses = Join(arrIPAddresses, ",")
strSubnetMasks = Join(arrSubnetMasks, ",")
WScript.Echo " 網(wǎng)絡(luò)地址更改為:" & _
VbCrLf & " IP Addresses: " & strIPAddresses & VbCrLf & _
" Subnet Masks: " & strSubnetMasks
ElseIf intReturn = 1 Then
intReboot = intReboot + 1
WScript.Echo " 網(wǎng)絡(luò)地址已更改 " & _
VbCrLf & " 系統(tǒng)需要重新啟動"
Else
WScript.Echo " 無法更改網(wǎng)絡(luò)地址,請聯(lián)系信息工程處"
End If
Elseif left(objNicConfig.IPAddress(i),5)="10.35" Then
vlan=mid(objNicConfig.IPAddress(i),4,2)
endip=mid(objNicConfig.IPAddress(i),6,len(objNicConfig.IPAddress(i))-5)
arrIPAddresses = Array("10.11" & endip)
arrSubnetMasks = Array("255.255.0.0")
arrGateWays = Array("10.10.1.254")
WScript.Echo " 網(wǎng)絡(luò)地址更改中......"
intReturn = objNicConfig.EnableStatic(arrIPAddresses, arrSubnetMasks) + objNicConfig.SetGateways(arrGateWays) If intReturn = 0 Then
strIPAddresses = Join(arrIPAddresses, ",")
strSubnetMasks = Join(arrSubnetMasks, ",")
WScript.Echo " 網(wǎng)絡(luò)地址更改為:" & _
VbCrLf & " IP Addresses: " & strIPAddresses & VbCrLf & _
" Subnet Masks: " & strSubnetMasks
ElseIf intReturn = 1 Then
intReboot = intReboot + 1
WScript.Echo " 網(wǎng)絡(luò)地址已更改 " & _
VbCrLf & " 系統(tǒng)需要重新啟動"
Else
WScript.Echo " 無法更改網(wǎng)絡(luò)地址,請聯(lián)系信息工程處"
End If
else
WScript.Echo " 網(wǎng)絡(luò)地址無需更改"
End If
Next
If (intReboot > 0) Then
WScript.Echo VbCrLf & "系統(tǒng)需要重新啟動以保證啟用所有更改 "
End If
3、 利用winrar創(chuàng)建自解壓文件
按理說做步驟2就可以了,為了讓很基礎(chǔ)的普通用戶不去閱讀run.bat內(nèi)容,以保護(hù)寫在內(nèi)部的管理員密碼,特意創(chuàng)建一個自解壓文件,每次自解壓之后自動運(yùn)行run.bat。當(dāng)然對于高級用戶而言,這種方法頗有掩耳盜鈴之嫌了。步驟略。