方案一:
Set oShell = WScript.CreateObject ("WSCript.shell")
oShell.run "shutdown -r -f -t 1", true
存在的問題:
ShutDown是XP的命令,因此該指令碼在WIN2K下不能運行。
即使在XP下,僅適用於超級使用者,普通使用者在DOS下執行後會提示:
操作成功完成。
用戶端沒有所需的特權。
(如果把ShutDown拷貝到WIN2K下,普通使用者也是這個提示)
因此該指令碼無法在普通使用者下實現重啟,實用度:2。
嚴格地說,普通使用者想用shutdown,則必須要有兩個許可權:關閉系統(SeShutdownPrivilege)、從遠端系統強制關機(SeRemoteShutdownPrivilege)。可以通過Tokenmon來驗證這一點,並且通過對INTERACTIVE組加上遠程關機許可權來解決問題。2009-05-10的03640號日誌中有更詳細的說明。另外,我們常用的procexp.exe(Process Explorer)也可以看出某個程式所具有的許可權。
方案二:
shutdown有問題,則換成其它關機命令試試,如:rundll32 shell32,SHExitWindowsEx 2
但在,在WIN2K與XP下,得到的結果都是:
shell32 出錯
丟失條目: SHExitWindowsEx
另一個用於Win98的命令也搬過來:rundll32 user.exe,RestartWindows
XP啟動並執行提示為:
應用程式或 DLL C:\WINDOWS\system32\user.exe 為無效的 Windows 映像。請再檢測一遍您的安裝盤。
載入 user.exe 時出錯
%1 不是有效 Win32 應用程式。
WIN2K下運行,則沒有這些提示,但是也沒有任何效果。
改為user32.exe,則XP與WIN2K都提示:
載入 user32.exe 時出錯
找不到指定的模組。
在XP下試成功:rundll32 shell32,#59
提示:@#$%必須重新啟動電腦才能使新的設定生效。
想現在就重新啟動電腦嗎?
但點擊“是”,卻沒重啟。並且提示資訊我們實際需要更改。
實用度:0
方案三:
顯示關機對話方塊
set oApplication = CreateObject("Shell.Application.1")
oApplication.ShutdownWindows()
雖然它可以在WIN2K與XP運行得很好,但它只是顯示關機的對話方塊,剩下,要關機、重啟、或登出,是使用者來選擇,“確定”也是使用者來點擊。網路上有使用發送游標上下移動鍵,以及斷行符號來實現自動重啟功能。自己感覺不是個好辦法。
實用度:1
方案四:
用批處理實現重啟
@echo off
setlocal
cd/d %temp%
echo [version] > reboot.inf
set inf=InstallHinfSection DefaultInstall
echo signature=$chicago$ >> reboot.inf
echo [defaultinstall] >> reboot.inf
rundll32 setupapi,%inf% 1 %temp%\reboot.inf
del reboot.inf
以上代碼學習的地方是很多,包括:setlocal、cd/d、rundll32 setupapi。但在WIN2K與XP下,普通帳號啟動並執行結果都是:安裝失敗。所以沒有重啟成功。而超級使用者卻正常。估計是要對註冊表HKLM\Software\Microsoft\Windows\CurrentVersion\RunOnce要有完全控制許可權。
實用度:1
方案五:
WMI
代碼如下:
Set oWMI = GetObject("winmgmts:" & _
"{impersonationLevel=impersonate,(Shutdown)}!" & _
"\\." & _
"\root\cimv2")
Set cOSs = oWMI.ExecQuery("Select * from Win32_OperatingSystem")
For Each oOS in cOSs
oOS.Reboot()
Next
它對WIN2K與XP都適用。
最後就用它了。