方案一:
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都适用。
最后就用它了。