前面一篇《[UMU WSH 教程](4)WSH 相关文件》有提到脚本超时问题,现在细说一下。
首先,写一个 Timeout.VBS,代码如下:
MsgBox WScript.Timeout
然后在“属性-脚本”页给它设置超时为 1 秒,这时会在同目录下生成 Timeout.WSH,现在我们分别运行 Timeout.VBS 和 Timeout.WSH,发现结果不一样,Timeout.VBS 显示 0,Timeout.WSH 显示 1。
接着测试,运行一下 wscript.exe,出现“Windows 脚本宿主设置”对话框,把超时设置为 2 秒,然后再分别运行 Timeout.VBS 和 Timeout.WSH,结果 Timeout.VBS 显示 2,Timeout.WSH 还是显示 1。

结论就是单独的设置超时优先于全局的设置。
UMU 为什么要说这个超时问题呢?原因是超时有时候好,有时候坏,我们应该了解它。比如说有人民群众想用 WSH 来写病毒,但用户把脚本超时打开,并设置为 1 秒,结果这病毒刚刚初始化完毕就被关掉了,这位人民群众一定很痛恨“超时”!聪明的病毒会在启动的时候检查一下全局超时设置,如果超时是打开的,就把它关闭,这样病毒就可以安然运行了。
Wscript.exe 把设置保存在注册表 HKEY_CURRENT_USER\Software\Microsoft\Windows Script Host\Settings 下,Timeout 为 0 表示不使用超时。
当然了,UMU 绝对不是教人写病毒,把这原理说清楚就是为了告诉广大人民群众怎么防止病毒修改这个超时设置。病毒会使用 WScript.Shell 来读取和修改注册表值,但 WScript.Shell 没办法改写注册表键的权限,所以我们可以把上面说的这个键设为只读。很可惜这招无法防止天下无敌 WMI,这个……以后再说,哼哼!

除了全局设置和 .WSH 设置,还可以用宿主的参数来设定超时,运行一下 wscript //? 就可以看到有一个参数是“//T:nn 超时设定秒:允许脚本运行的最长时间”。但是这样要每次去敲命令行,太累了,可以把 //T:nn 写到注册表里,比如想单独设置 .VBS 脚本程序的超时,不影响其他文件,那么可以改注册表 HKEY_CLASSES_ROOT\VBSFile\Shell\Open\Command 下的默认键,原来是 %SystemRoot%\System32\WScript.exe "%1" %*,在后面增加 //T 参数,比如改为 %SystemRoot%\System32\WScript.exe "%1" %* //T:1,这样就单独给 .VBS 脚本程序设置了超时为 1 秒。
看来写病毒还是挺累的,就为了一个超时,它要检查它目录下有没有自己的配制文件,有的话删除,然后再检查 HKEY_CURRENT_USER\Software\Microsoft\Windows Script Host\Settings 下的 Timeout 值,接着还要用 WScript.Arguments 检查它的参数里有没有 //T:nn。累,实在累,所以人民群众没事还是别写病毒了!维护网络和平的任务就交给您了!