用脚本改变远程注册表

ZDNet软件频道 时间:2004-05-08 作者:TechRepublic.com |  我要评论()
本文关键词:
我有一个朋友,他非常专注和乐意于Windows的命令提示符(Command Prompt)操作,并且经常以这些操作和我开玩笑,这是日常生活的例子。
本文译自TechRepublic,未经许可请勿转载

我有一个朋友,他非常专注和乐意于Windows的命令提示符(Command Prompt)操作,并且经常以这些操作和我开玩笑,这是日常生活的例子。然而,任何在Windows GUI中的操作都可以在命令提示符中实现,比如脚本化不同的操作。必须承认的是,对于一次性的操作,脚本化是一种“过分”的执行。如果你必须改变注册表,你愿意编写和调试一个50行的脚本,或是愿意打开REGEDIT,而不断地点击鼠标?而且,如果你有很多机器的注册表需要更新,脚本化可以成为一个节省时间的操作,因为一个简单的脚本可以更新所有远距离机器上的注册表,而不是人工地更改注册表。

开始之前

在开始之前,我想要指出的是,更改注册表是相当危险的操作。不正确的更改会损坏Windows系统和/或你的用户程序。而且,当使用脚本程序时,不正确更改的可能性会增大。所以,在运行任何注册表更改脚本程序之前,一定要备份好所有相关的内容。在大规模运行之前,你也应该完全地测试好你的脚本程序。

Peeking和poking

当我在15岁第一次接触编程时,我经常使用的是两个语句就是peekpoke,Peek指的是查找一个特定内存地址以查看该地址上的值。Poke是用于将一个值插入到一个特定的内存位置。

我现在不是一个职业开发人员,所以我不太清楚这两个语句是否还使用。但是,peekpoke语句很恰当地描述了我将要向你说明如何建立的脚本。其中一个脚本,我将之称为peek脚本,其作用是在注册表中查找一个特定的位置,并返回这一注册表键的值。

另一个脚本,我把它称为poke脚本,其作用是在一个注册表键位置中插入一个值。Poke脚本也可以建立一个注册表键,只要这个注册表键先前不存在。例如,我将通过脚本实现一个screen saver。我先使用peek代码来查找是否存在一个screen saver,如果没有,我将使用poke脚本来插入该值。当然,这两个脚本也可以合二为一。

Peek脚本

让我们看看peek脚本。以下的脚本将查找是否存在screen saver。如果screen saver已经存在,脚本返回1,否则返回0:

On Error Resume Next
HKEY_CURRENT_USER = &H80000001
strComputer = "."
Set objReg = GetObject("winmgmts:" & strComputer & " ootdefault:StdRegProv")
strKeyPath = "Control PanelDesktop"
ValueName = "ScreenSaveActive"
    objReg.GetStringValue HKEY_CURRENT_USER, strKeyPath, ValueName, strValue
If IsNull(strValue) Then
    Wscript.Echo "Verify whether or not a screen saver is being used:  The value is either Null or could not be found in the registry."
Else
    Wscript.Echo "Verify whether or not a screen saver is being used: ", strValue
End If


这一脚本的第一行为On Error Resume Next。这一命令可以避免出现错误。接着三行设置了当前用户和计算机。这些代码行立即查找当地机器中的screen saver设置。这些代码行也可以很容易地更改以查找一个远距离机器或者多个远距离机器中的注册表。

如果增加一些趣味性,可以增加以下代码行:

strKeyPath = "Control PanelDesktop"
ValueName = "ScreenSaveActive"


正如你所看到的,strKeyPath命令包含一个注册表路径。当执行这一脚本,其路径将被附加在HKEY_CURRENT_USER以成为一个更完整的路径。我过后将给你说明这一过程如何进行。ValueName命令告诉脚本应该查找哪些特定的注册表键。当前情况的键为ScreenSaveActive。

objReg.GetStringValue命令告诉脚本在注册表中查找指定的位置,并返回该位置上的字符值。你可以注意到,这一命令也会返回HKEY_CURRENT_USER值。这一命令附带着ValueName参数,这一参数将传递到ScreenSaveActive和strValue值。当脚本处理这一命令时,如下所示:

objReg.GetStringValue HKEY_CURRENT_USERControl PanelDesktopScreenSaveActive, strValue

脚本运行的下一行检查返回的值。如果脚本运行strValue,而且该值为空,那么将显示一个错误以说明该值要么为空要么在注册表不能找到。

假设不显示错误信息,并且如果screen saver存在,这脚本最终显示为1,否则显示为0。


百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134