深入淺出Win2000電腦啟動/關機指令碼
一.簡介
Win2000電腦啟動/關機指令碼(startup/shutdown scripts)是Win2000的一個新特點。啟動指令碼是邀請使用者登入之前啟動並執行批檔案,它的功能類似於Win9X和DOS中的自動執行批次檔autoexec.bat;關機指令碼是電腦關機之前啟動並執行批檔案。
與Win2000使用者登入/登出指令碼(logon/logoff scripts)相比,它們之間的主要區別是:
電腦啟動/關機指令碼在電腦啟動和關機時運行;指令碼程式只運行一次,通常在啟動指令碼運行完畢後才出現邀請使用者登入的對話方塊;
使用者登入/登出指令碼在邀請使用者登入的對話方塊出現後,使用者登入系統或從系統登出時運行,運行次數由使用者登入/登出的次數決定,每登入/登出系統一次,指令碼程式就運行一次。
二.指派
在啟用電腦啟動/關機指令碼前,必須進行指派.指派電腦啟動/關機指令碼需要通過組策略MMC(管理主控台)嵌入式管理單元進行,具體的操作如下:
1.單擊"開始"菜單->"運行",在開啟框內輸入"MMC",開啟微軟管理主控台(Microsoft ManagementConsole,MMC)。
2.單擊"控制台"菜單->"添加/刪除嵌入式管理單元...",在跳出"添加/刪除嵌入式管理單元"對話方塊內單擊"添加"按鈕,添加獨立嵌入式管理單元。
3.在"添加獨立嵌入式管理單元"對話方塊的"可用的獨立嵌入式管理單元"列表內選擇"組策略",按下面的"添加"按鈕。
4.當系統詢問使用哪一個組策略對象時,如果你要指派面向本機電腦,只在本機電腦執行的啟動/關機指令碼,請選擇預設的"本機電腦"組策略對象;如果你要指派面向Win2000域,在域內所有電腦上執行的啟動/關機指令碼,那請點擊"選擇組策略對象"對話方塊中的"瀏覽..."按鈕,在"瀏覽組策略"對話方塊選定能應用到整個域中的組策略對象,這裡以"Default Domain Policy"對象為例,它是Win2000域預設的域策略對象。
5.完成後依次關閉各對話方塊回到管理主控台,現在管理主控台上就有了一個相應的組策略對象樹。
6.在管理主控台左側的主控台樹狀目錄窗格中,依次展開組策略對象->"電腦配置"->"Windows設定"->"指令碼(啟動/關閉)"節點,雙擊右側詳細資料窗格中的"啟動"或"關機"項目就可以設定電腦啟動或關機時使用的指令碼了(因Win2000電腦啟動和關機指令碼的設定方法相同,下面的操作均以啟動指令碼為例)。
7.雙擊右側詳細資料窗格中的"啟動"項目,在跳出的"啟動屬性"對話方塊中點擊"添加"按鈕,添加新的電腦啟動指令碼。
8.一個啟動指令碼條目包括兩方面的內容:指令碼名和指令碼參數。如果指令碼名不包含檔案路徑,比中的指令檔名只是"scripta.vbs",系統會到預設的電腦啟動指令碼路徑下尋找這個指令檔。指令碼的參數是可選的,可填可不填,看實際情況而定。
9.本機電腦指令碼的預設路徑通常是
%systemroot%/system32/GroupPolicy/Machine/Scripts
如
C:/winnt/system32/GroupPolicy/Machine/Scripts
應用到域的電腦指令碼的預設路徑通常是
// /sysvol/ /Policies/ /Machine/Scripts
如
//MyDC1/sysvol/Mydom.com/Policies/{31B2F340-016D-11D2-832F-00C04FB873F9}/Machine/Scripts
啟動指令檔存放在"Startup"子檔案夾中,關機指令檔存放在"ShutDown"子檔案夾中。
10.我們可以根據需要重複點擊"啟動屬性"對話方塊中的"添加"按扭,為電腦添加多個啟動指令碼。
11.設定完畢,儲存後退出組策略MMC嵌入式管理單元.等組策略重新整理後,這些指令碼就會在電腦啟動和關機時起作用。
三.深入
1.我們對電腦啟動/關機指令碼的設定資料被Win2000儲存在了一個名為scripts.ini的隱藏設定檔中,這個檔案位於
C:/WINNT/system32/GroupPolicy/Machine/Scripts
目錄下,可以使用任一款檔案編輯軟體如記事本進行編輯。
scripts.ini檔案內容通常包含兩個資料區段:[Startup]和[Shutdown],[Startup]資料區段下是啟動指令碼配置,[Shutdown]資料區段下是關機指令碼配置。每個指令碼條目被分成指令碼名和指令碼參數兩部分存貯,指令碼名儲存在XCmdLine關鍵字下,參數儲存在XParameters關鍵字下,這裡的X表示從0開始的指令碼序號,以區別多個指令碼條目和標誌各指令碼條目的運行順序。
下面是一個簡單的scripts.ini檔案的例子:
[Startup]
0CmdLine=d:/start/ss.bat
0Parameters=
1CmdLine=scriptsa.vbs
1Parameters=start
[Shutdown]
0CmdLine=shut.vbs
0Parameters=
從例子中我們可以看出,共設定了兩個電腦啟動指令碼:ss.bat和scripta.vbs。
ss.bat位於d:/start目錄下,沒有使用參數。
scriptsa.vbs位於預設的啟動指令碼目錄C:/WINNT/system32/GroupPolicy/Machine/Scripts/Startup下,使用了參數"start"。
兩個指令碼的執行順序是先執行ss.bat後執行scriptsa.vbs.設定了一個關機指令碼shut.vbs,沒有使用參數,該指令碼位於預設的關機指令碼目錄C:/WINNT/system32/GroupPolicy/Machine/Scripts/Shutdown下。
2.啟動/關機指令碼的運行情況,包含是否同步運行、是否顯示運行狀態、最長等待時間等,都可以在組策略中進行微調。具體操作如下:
(1)-(5)步同第二部分指派操作中的1-5步;
(6)在管理主控台左側的主控台樹狀目錄窗格中,依次展開組策略對象->"電腦配置"->"系統管理範本"->"登入"節點,右側詳細內容窗格中顯示的內容有四項與啟動/關機指令碼有關;非同步運行啟動指令碼,顯示啟動指令碼的運行狀態,顯示關機指令碼的運行狀態,組策略指令碼的最長等待時間。
(7)非同步運行啟動指令碼
在預設情況(也就是沒有配置的情況,下同)下,系統要等每個啟動指令碼運行完畢才運行下一個啟動指令碼.如果啟用這個策略,系統則不會協調啟動指令碼的運行順序,啟動指令碼可以同時運行.如果停用或不配置這個策略,每個啟動指令碼要在上一個指令碼運行完畢後才能運行。建議不配置。
這個策略對應的註冊表值是
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/policies/system/RunStartupScriptSync
這是一個REG_DWORD值,0表示啟用,1表示禁用。
(8)顯示啟動/關機指令碼的運行狀態
在預設情況下,系統不顯示啟動指令碼中的指令.如果啟用這個策略,系統會在啟動指令碼運行時顯示每個指令,指令將出現在命令視窗,或顯示出人機互動介面。這個功能主要是為進階使用者設計的.如果停用或不配置這個策略,指令則不會顯示。建議不配置。
舉個例子,假設你在啟動指令碼中有一條命令是"c:/winnt/explorer.exe c:/winnt",如果啟用了這一策略允許顯示啟動指令碼的運行狀態,那麼當電腦啟動時,一個資源管理員視窗就會跳出來,案頭被開啟,系統以system使用者的身份互動登入到電腦上,這無異於那個著名的IME漏洞!由此可以看出,開啟啟動/關機指令碼的運行狀態有時是非常危險的。
這兩個組策略條目對應的註冊表值分別是
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/policies/system/HideStartupScripts
和
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/policies/system/HideShutdownScripts
均為REG_DWORD值,0表示啟用,1表示禁用。
(9)組策略指令碼的最長等待時間
這個策略限制了由組策略完成運行登入、開始和關閉指令碼所需的全部時間。如果當指定時間已超過但指令碼尚未完成運行,系統會停止指令碼處理並記錄一個錯誤事件。在預設情況下,系統允許合并的指令碼集運行600秒(10分鐘)。
要使用這個策略,在第二個框中鍵入從1到32000之間的數目以確定您希望系統等待指令碼完成的時間,單位是秒。要讓系統一直等到完成運行指令碼為止,無論等待時間多久,請鍵入0。但不建議這樣,如果你的指令碼寫的很差,那後果將難以想象!
如果其它系統任務必須等待指令碼完成才能進行,這個間隔時間就非常關鍵。在預設的情況下,必須完成每一個啟動指令碼後才能運行下一個,您還可以使用"非同步運行啟動指令碼"策略讓系統等到完成啟動指令碼後再出現邀請使用者登入的對話方塊。間隔過長可延緩系統並使使用者不方便,如果間隔太短,所需的任務無法完成系統會可能會過早就緒,導致出現問題。
這個組策略條目對應的註冊表值是
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows /CurrentVersion/policies/system/MaxGPOScriptWait
也是一個REG_DWORD值,它的值表示等待的時間,單位是秒。
四.應用
電腦啟動/關機指令碼的用途很多,下面舉三個比較典型的例子:
1.電腦啟動和關機時間審核
(1)編寫一個能夠記錄時間的指令碼LogTime.vbs,內容如下:
'================================================
dim ArgObj,str,strtmp
Set ArgObj = WScript.Arguments
If ArgObj.Count < 1 Then
strtmp="無參數操作!"
else
select case ArgObj.Item(0)
case "startup"
strtmp=" 伺服器啟動."
case "shutdown"
strtmp=" 伺服器關閉."
case else
strtmp=" 未知操作!參數:"+ArgObj.Item(0)
end select
end if
set fso=CreateObject("Scripting.FileSystemObject")
set tmp=fso.opentextfile("d:/log/logtime.txt",8,true)
str="["+cstr(now())+"] "+strtmp+chr(13)+chr(10)
tmp.write str
tmp.close
set tmp=nothing
set fso=nothing
'=================================================
這個指令碼有兩個參數:startup和shutdown。當用作啟動指令碼時,使用"startup"參數;當用做關機指令碼時,使用"shutdown"參數.另外,指令碼中使用了FileSystemObject對象,使用該指令碼前請確保這個對象已經存在於你的電腦上。
(2)按照前面的方法將指令碼設定好.每次電腦啟動或關機,這個指令碼都會運行,並將電腦啟動或關機的時間(實際上這個指令碼運行時的時間,但兩者應該相差無幾)記錄到一個文字檔中,例子中是"d:/log/logtime.txt",可以根據需要更改。
2.刪除一些特殊的共用
在Win2000中,由於電腦管理、使用者登入等方面的需要,系統會建立許多特殊的共用,如C$、D$、ADMIN$、IPC$、NETLOGON等,但這些共用並不是所有的電腦都必須的.使用"電腦管理"MMC或net share命令等禁止這些共用,只是一種治標不治本的方法,它們在電腦重新啟動後會重新出現.基於安全等方面的考慮,我們有時希望將這些共用徹底刪除.現在刪除這類特殊共用的方法比較多,如編輯註冊表,下面就再提供一種使用啟動指令碼刪除這些特殊共用的方法。
(1)編寫一個能刪除特殊共用的批次檔DelShare.bat,內容如下:
net share C$ /delete
net share D$ /delete
net share IPC$ /delete
net share NETLOGON /delete
(2)按照前面的方法將指令碼設定為啟動指令碼,重新啟動電腦.OK,一切都清淨了。
3.恢複管理員密碼或建立管理員帳號
丟失管理員密碼是件非常令人頭疼的事情,但說不定什麼時候就會碰到.在緊急情況下,如何恢複管理員密碼乃至建立一個管理員帳號,現在已經有許多成熟的技術,如經典的登入螢幕保護裝置程式法、使用O&O軟體等。實際上,使用啟動指令碼也是一個相當不錯的選擇。
(1)如果故障電腦使用FAT/FAT32檔案系統,那可直接使用Win98引導盤引導.如果使用NTFS檔案系統,可將故障電腦上的硬碟取下,以從盤模式掛接到其它的Win2000電腦上.下面的操作以後一種情況為準,假設現在故障電腦的system分區(通常是C在新的電腦上成為分區E:。
(2)編寫一個能恢複管理員密碼的批次檔admin.bat,內容只需要一條"net user"命令即可.如下:
net user administrator 12345678
這兒我們假設當前的管理員是administrator,將它的密碼恢複為"12345678".將檔案admin.bat儲存到"E:/winnt/system32/GroupPolicy/Machine/Scripts/Startup"下,也就是故障電腦原來的"C:/winnt/system32/GroupPolicy/Machine/Scripts/Startup"下。
(3)編寫一個啟動/關機指令碼設定檔scripts.ini,這個檔案名稱是固定的,不能改變.內容如下:
[Startup]
0CmdLine=admin.bat
0Parameters=
將檔案scripts.ini儲存到"E:/winnt/system32/GroupPolicy/Machine/Scripts"下,也就是故障電腦原來的"C:/winnt/system32/GroupPolicy/Machine/Scripts"下。
(4)將硬碟恢複為主盤,接回原來的電腦,重新啟動,等待啟動指令碼運行.啟動指令碼運行結束管理員administrator的密碼就被恢複為"12345678"。
(5)如果要建立一個管理員帳號,admin.bat檔案的內容可以修改為:
net user admin 12345678 /add
net localgroup administrators admin /add
這樣一個名為"admin",密碼是"12345678"的管理員帳號就建立了。
這個方法不僅可以恢複獨立伺服器上本地管理員密碼,也可以恢複Win2000域中網域系統管理員的密碼。
附:
關於 Windows 2000 中的登入、登出、啟動和關機指令碼的概述http://support.microsoft.com/kb/198642/zh-cn有關 Windows Script Host 的更多資訊,請訪問下面的 Microsoft Web 網站:
http://msdn2.microsoft.com/en-us/library/shzd7dy4.aspx