当前位置: 首页 > 图文教程 > 脚本技术 > VBScript > 运行脚本之前,如何确定计算机上的默认脚本宿主的代码

VBScript
vbs 列出该目录下所有文件和文件夹的类型,大小,和所有者
雷客图 站长安全助手 vbs版代码(asp 木马查找)
discuz 任意管理员密码漏洞利用工具 vbs代码
添加网站到安全站点.设置安全站点打开ActiveX时提示.去页眉页脚的vbs代码
文件夹定时自动备份 AutoBackUpFolder.vbs
iis PHP安装脚本 PHPInstall.vbs V3.1
HTA文件去除html控件认证和接收命令行参数
vbs 更改环境变量
excel2access vbs脚本
VBS 下载方法(CDO.MESSAGE)
vbs实现myipneighbors 域名查询结果整理
修改 Gateway和DNS的vbs脚本
VBS sendkeys 模拟击键操作 问题解决
用vbscript来添加ip策略 自动封IP
vbs,hta中选择文件夹对话框实现代码
WMI 脚本高手不完全手册
vbscript语句中“&H”专用于16进制数表示
URL 筛选小工具 提取网页中的链接地址
VBScript 文件操作代码小结
vbs 错误捕获器,用于捕获内部错误并进行手工处理

VBScript 中的 运行脚本之前,如何确定计算机上的默认脚本宿主的代码


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-11   浏览: 100 ::
收藏到网摘: n/a

问:
您好,脚本专家!我知道,在运行脚本时,可使用代码确定脚本是否在 WScript 或 CScript 中运行。但我想不明白的是:运行脚本之前,如何确定计算机上的默认脚本宿主?
-- AT
答:
您好,AT。您知道,人们完全难倒脚本专家并不是常事;不过我们不得不承认这个问题的确有点挑战性。(嗯,嗯:那么,或许它并不足以能够难倒脚本专家;老实说,事实上它相当简单。不过你们无需知道这些。)我们还不知道如何回答这个问题,但我们知道,为了帮助您解决这个问题,我们将会需要大量辛勤的工作和奉献。
但是,在困难面前,脚本专家放弃过吗?嗯,事实上,我们放弃过。不过,在处理一些毫不相关的事情时,我们却意外发现了答案。以下这个脚本(使用有点迂回的方法)将告诉您计算机上的默认脚本宿主:
复制代码 代码如下:

Const HKEY_CLASSES_ROOT = &H80000000
strComputer = "."
Set objRegistry = GetObject("winmgmts:\\" & strComputer & "\root\default:StdRegProv")
strKeyPath = "VBSFile\Shell\Open\Command"
objRegistry.GetExpandedStringValue HKEY_CLASSES_ROOT,strKeyPath,vbNullString,strValue
strValue = LCase(strValue)
If InStr(strValue, "wscript.exe") then
Wscript.Echo "WScript"
Else
Wscript.Echo "CScript"
End If

从中可以看出,有关默认脚本宿主的信息存储在注册表中,尽管不是处在特别明显的位置。您所需要做的只是打开 HKEY_CLASSES_ROOT,找到注册表项 VBSFile\Shell\Open\Command,然后查看默认值。(默认值是个例外的未命名的注册表值,该注册表值在 Regedit 中以“(默认)”的形式出现。)“(默认)”的值将是脚本宿主可执行程序的路径 (例如,%SystemRoot%\System32\WScript.exe)。换句话说,可执行程序文件将告诉您默认脚本宿主是 CScript 还是 WScript。
那么,实际上我们如何获得该值呢?嗯,我们首先定义一个名为 HKEY_CLASSES_ROOT 的常量,并将其值设定为 &H80000000;这会告诉脚本我们要使用哪个注册表配置单元。然后,连接到本地计算机上的 WMI 服务(尽管我们可轻而易举地对远程计算机运行该脚本),务必绑定到 root\default 命名空间。(大多数 WMI 脚本使用 root\cimv2 命名空间,但是出于某些原因,系统注册表提供程序还是位于 root\default 中。可能是住房较便宜或是学校较好的原因吧。)
进行连接后,我们创建名为 strKeyPath 的变量,并为其分配值 VBSFile\Shell\Open\Command。此时,我们准备从注册表中读取该值。
什么?难道我们忘了什么事情?不,我们未忘记任何事情。(尽管现在您提到它,但我们却有点想知道在我们早上离开屋子的时候是否有人将炉子关闭。)您说对了,在大多数 WMI 注册表脚本中,我们需要将值分配给两个变量,一个代表注册表项,另一个代表注册表项中所需的值。不过,在本例中,我们不需要创建在其中存储注册表值名称的变量。为什么不能呢?因为,从技术角度来说,“(默认)”值实际上并没有名称;它们只不过是默认值而已。我们最终所要做的是告诉该脚本从此特殊的注册表项中读取 Null 值。这听起来似乎不是很好的计划,不过幸运的是,“注册表提供程序”将知道这意味着读取“(默认)”值。
事实上,当谈到这个主题时,以下该行代码便可为我们检索值:
objRegistry.GetExpandedStringValue HKEY_CLASSES_ROOT,strKeyPath,vbNullString,strValue
因为“(默认)”碰巧具有 REG_EXPAND_SZ 数据类型,所以我们调用 GetExpandedStringValue 方法,传递四个参数:
? HKEY_CLASSES_ROOT,告诉脚本要使用哪个注册表配置单元的常量。
? strKeyPath,告诉脚本要使用哪个注册表项的变量。
? vbNullString,一个代表 Null 值的 VBScript 常量。这是我们通常插入代表值名称变量之处,不过正如我们说过的,这次我们的值没有名称。
? strValue,一个“输出”参数。GetExpandedStringValue 需要用一个地方来存储其从注册表中读取的值;输出参数只是一个占位符变量,可在其中存储值。
GetExpandedStringValue 可用后,我们便可使用该行代码将 strValue 中的所有字符更改为小写;这样做是为了更容易确定该值是否含有特殊字符串。
strValue = LCase(strValue)
最后,我们调用 InStr 函数,看看是否可在 strValue 中任何地方找到该字符串值 wscript.exe。如果可以找到,则我们将回显默认脚本宿主 WScript;如果没有找到,则一定意味着默认脚本宿主为 CScript:
复制代码 代码如下:

If InStr(strValue, "wscript.exe") then
Wscript.Echo "WScript"
Else
Wscript.Echo "CScript"
End If
这样就可以了,AT:现在,在不运行脚本的情况下,您便可确定计算机上的默认脚本宿主。(是的,我们知道您不得不运行确定默认脚本宿主的脚本…不过您找到答案了。)我们希望您能发现此脚本的用处,并希望每个人在今天都学到了重要一课:尽你所能,也无法难倒脚本专家。
嗯,除非您问我们一个无法回答的问题。但是,只要问我们可以回答的问题就绝不会难倒我们。
是的:几乎没有可能。