Board logo

标题: [注册表类] [已解决]批处理监视注册表项 [打印本页]

作者: wh1234567    时间: 2012-6-3 19:52     标题: [已解决]批处理监视注册表项

本帖最后由 wh1234567 于 2012-6-16 14:44 编辑

当监视某个注册表项名称数值为29时就执行我的命令,如果监视数值不是29就不执行命令,如何写?
例如
注册表项"HKEY_LOCAL_MACHINE\333" 里右边的名称"444" 里的数值29

我的命令放在下面
作者: gawk    时间: 2012-6-4 08:55

http://www.bathome.net/thread-3747-1-1.html
作者: wh1234567    时间: 2012-6-4 11:10

这个看不懂啊
作者: tz_being    时间: 2012-6-4 13:16

别整HKLM\333,那个地方建立不了新项,就整HKLM\Software\333吧。
  1. for /f "skip=4 tokens=1,2,*" %%i in ('reg query "HKLM\Software\333" /v 444') do set Ver=%%k
  2. if not %Ver%==29 goto :eof
  3. ::你的命令
  4. echo OK!Ver is 29.
  5. pause
复制代码

作者: gawk    时间: 2012-6-4 13:39

回复 3# wh1234567


    边看边试,就懂了。
作者: powerbat    时间: 2012-6-4 13:50

你的目的是监视还是查询?
作者: wh1234567    时间: 2012-6-4 15:17

本帖最后由 wh1234567 于 2012-6-4 15:19 编辑

回复 4# tz_being

不行,闪了下就没了
另外说下,不是建立新项,而是监视那里的数值29
作者: wh1234567    时间: 2012-6-4 15:17

回复 6# powerbat

是监视
作者: powerbat    时间: 2012-6-4 16:24

回复 8# wh1234567
vbs
  1. Hive = "HKEY_LOCAL_MACHINE"
  2. KeyPath = "Software\333"
  3. ValueName = "444"
  4. Set ws = CreateObject("WScript.Shell")
  5. Set Sink = WScript.CreateObject("WbemScripting.SWbemSink", "SINK_")
  6. Set objWMIServices = GetObject("winmgmts:" & _
  7.     "{impersonationLevel=impersonate}!\\.\root\default")
  8. objWMIServices.ExecNotificationQueryAsync Sink, _
  9.     "Select * from RegistryValueChangeEvent Where " & _
  10.     "Hive = '"&Hive&"' and " & _
  11.     "KeyPath = '"&Replace(KeyPath,"\","\\")&"' and " & _
  12.     "ValueName = '"&ValueName&"'"
  13. WScript.Echo "Listening for Registry Change Events..." & vbCrLf
  14. Do : WScript.Sleep 1000 : Loop
  15. Sub SINK_OnObjectReady(wmiObject, wmiAsyncContext)
  16.     Value = ws.RegRead(Hive&"\"&KeyPath&"\"&ValueName)
  17.     'WScript.Echo Value
  18.     if CStr(Value)="29" then ws.Run "a.bat",0
  19. End Sub
复制代码

作者: tz_being    时间: 2012-6-4 17:48

回复  tz_being

不行,闪了下就没了
另外说下,不是建立新项,而是监视那里的数值29
wh1234567 发表于 2012-6-4 15:17


你注册表的这个地方HKLM\Software\333没有数值,当然自动退出了;如果有数值29就运行你的命令了
作者: wh1234567    时间: 2012-6-4 19:08     标题:

本帖最后由 wh1234567 于 2012-6-5 23:42 编辑

回复 10# tz_being


    有数值的,数值就是29也退出了不能执行a.bat
作者: wh1234567    时间: 2012-6-4 19:11

本帖最后由 wh1234567 于 2012-6-4 19:18 编辑

回复 9# powerbat


    我的命令放到哪,提示是英文看不懂啊
我的命令是a.bat这个吗?是代码不行还是我不会使用
作者: wh1234567    时间: 2012-6-4 19:16

最好的办法是不是在进程里全自动监视?
作者: powerbat    时间: 2012-6-5 21:57

回复 12# wh1234567


    对。a.bat可用其他程序代替。
作者: wh1234567    时间: 2012-6-5 23:41

能不能弄成在进程里全自动监视的那种?当监视到数值变化到29就自动执行a.bat,不是运行一次监视一次,而是运行后就在进程里全自动监视
作者: powerbat    时间: 2012-6-6 00:09

回复 15# wh1234567


    这就是6楼问你的目的,9楼的代码正是运行后一直监视。
作者: wh1234567    时间: 2012-6-6 09:24

数值是29也不自动执行a.bat啊,咋回事?
作者: wh1234567    时间: 2012-6-6 09:29

Listening for Registry Change Events...


脚本:        C:\Documents and Settings\Administrator\桌面\新建 文本文档 (2).vbs
行:        18
字符:        5
错误:        无法打开注册键值 "HKEY_LOCAL_MACHINE\333\444" 进行读取。
代码:        80070002
源:         WshShell.RegRead

这个代码需修正,应该是"HKEY_LOCAL_MACHINE\333" 里右边的名称"444
而不是HKEY_LOCAL_MACHINE\333\444
作者: powerbat    时间: 2012-6-6 10:27

回复 18# wh1234567

为了便于显示,作了少许修改,但不影响原有功能。
C:\Users\root\Desktop>type a.bat
@echo hello&pause

C:\Users\root\Desktop>type a.vbs
...
Sub SINK_OnObjectReady(wmiObject, wmiAsyncContext)
    Value = ws.RegRead(Hive&"\"&KeyPath&"\"&ValueName)
    WScript.Echo "Registry Value Changed: " & Value
    if CStr(Value)="29" then ws.Run "a.bat" ',0 '后面加0表示隐藏窗口运行

End Sub

C:\Users\root\Desktop>start /b cscript C:\Users\root\Desktop\a.vbs

Listening for Registry Change Events...

C:\Users\root\Desktop>reg add hklm\Software\333 /v 444 /d 28 /f
操作成功完成。

Registry Value Changed: 28

C:\Users\root\Desktop>reg add hklm\Software\333 /v 444 /d 29 /f
操作成功完成。

Registry Value Changed: 29

C:\Users\root\Desktop>


vbs运行a.bat弹出了一个窗口:
hello
请按任意键继续. . .

作者: wh1234567    时间: 2012-6-6 13:02

系统找不到指定的路径。
hello
请按任意键继续. . .
作者: powerbat    时间: 2012-6-6 13:22

回复 20# wh1234567


    你想说什么呢?
作者: wh1234567    时间: 2012-6-6 13:31

回复 21# powerbat


    不管用,没效果
作者: powerbat    时间: 2012-6-6 13:35

回复 22# wh1234567


那你的
hello
请按任意键继续. .
是怎么来的呢?

和你们交流真是累死了。。。
作者: wh1234567    时间: 2012-6-6 13:57

hello
请按任意键继续. .
按任意键后就自动退出了,进程里也看不到,注册表里相应的29也没见变化,我的a.bat是处理注册表项的,但没见自动执行a.bat
我的a.bat和你刚才这个批处理是在相同目录下的
作者: wh1234567    时间: 2012-6-6 13:58

是不是刚才你这个代码不完整啊?
作者: powerbat    时间: 2012-6-6 14:05

回复 25# wh1234567


    你把19楼的内容好好看一遍,对比一下你是哪里写的有问题。
作者: wh1234567    时间: 2012-6-6 16:37

我就是复制的你这个代码啊,
代码里... 这个是什么意思?
作者: powerbat    时间: 2012-6-6 16:44

19楼引用的内容是在cmd中手动执行命令进行演示的过程。
...是英文省略号,表示省略9楼代码的相同部分以免浪费,还特意用蓝色区分与9楼代码不同的地方。浅蓝色是vbs的执行结果。
作者: wh1234567    时间: 2012-6-6 16:48

C:\Users\root\Desktop
为什么指定路径,在当前路径不行吗
我的批处理只能自己创建个文件夹放进去?哎
作者: powerbat    时间: 2012-6-6 17:17

回复 29# wh1234567


    省略路径当然也可以。
那是我的cmd初始目录不是C:\Users\root\Desktop,而在其他地方运行过那条命令,后来我切换到桌面,直接按↑↓方向键调出历史命令,懒得重新输入。

你的bat随便放在哪里都可以,只要在ws.Run那里填上正确的路径即可(相对路径也行)。
这个vbs的作用只是监视注册表和启动bat,你在bat里可以随便写,已经与这个vbs无关了。
作者: wh1234567    时间: 2012-6-6 17:42

本帖最后由 wh1234567 于 2012-6-6 17:47 编辑

C:\Users\root\Desktop>type a.bat
@echo hello&pause

C:\Users\root\Desktop>type a.vbs
...
Sub SINK_OnObjectReady(wmiObject, wmiAsyncContext)
    Value = ws.RegRead(Hive&"\"&KeyPath&"\"&ValueName)
    WScript.Echo "Registry Value Changed: " & Value
    if CStr(Value)="29" then ws.Run "a.bat" ',0 '后面加0表示隐藏窗口运行
End Sub

C:\Users\root\Desktop>start /b cscript C:\Users\root\Desktop\a.vbs

Listening for Registry Change Events...

C:\Users\root\Desktop>reg add hklm\Software\333 /v 444 /d 28 /f
操作成功完成。

Registry Value Changed: 28

C:\Users\root\Desktop>reg add hklm\Software\333 /v 444 /d 29 /f
操作成功完成。

Registry Value Changed: 29

C:\Users\root\Desktop>


vbs运行a.bat弹出了一个窗口:
hello
请按任意键继续. . .

你这个是vbs的还是bat的?感觉很乱,并且不能运行提示错误,你能不能整理下
作者: powerbat    时间: 2012-6-6 18:02

回复 31# wh1234567


     28楼:“19楼引用的内容是在cmd中手动执行命令进行演示的过程。”同学你没睡醒吧?
作者: wh1234567    时间: 2012-6-7 00:54

脚本:        C:\Documents and Settings\Administrator\桌面\新建 文本文档 (2).vbs
行:        18
字符:        5
错误:        无法打开注册键值 "HKEY_LOCAL_MACHINE\333\444" 进行读取。
代码:        80070002
源:         WshShell.RegRead

这个代码需修正,应该是"HKEY_LOCAL_MACHINE\333" 里右边的名称"444
而不是HKEY_LOCAL_MACHINE\333\444

会出错的,另外,当第一次运行时注册表项数值正好是29的话就无法执行a.bat 了,
作者: wh1234567    时间: 2012-6-7 01:03

本帖最后由 wh1234567 于 2012-6-7 01:20 编辑

Value = ws.RegRead(Hive&"\"&KeyPath&"\"&ValueName)
会弹出错误的对话框,是不是需修正下这个代码?
另外,能不能弄成当第一次运行或在监视的过程中发现数值是大于29就自动执行a.bat,这样比较稳定一些,
作者: powerbat    时间: 2012-6-7 13:17

回复 33# wh1234567


19楼的代码已经演示了,完全正常,不知为何到你那里就有各种问题。
1、你的操作系统是什么?
2、你的用户权限够不够?
3、请帖出你的完整代码。
作者: wh1234567    时间: 2012-6-7 13:32

本帖最后由 wh1234567 于 2012-6-7 13:35 编辑

xp的,代码就是复制你的9楼的代码,19楼的我看不懂,没法测试成功
作者: powerbat    时间: 2012-6-7 14:26

本帖最后由 powerbat 于 2012-6-7 14:27 编辑

回复 36# wh1234567


Microsoft Windows XP [版本 5.1.2600]
(C) 版权所有 1985-2001 Microsoft Corp.

C:\Documents and Settings\Administrator>cd /d D:\

D:\>type a.vbs
Hive = "HKEY_LOCAL_MACHINE"
KeyPath = "Software\333"
ValueName = "444"

Set ws = CreateObject("WScript.Shell")
Set Sink = WScript.CreateObject("WbemScripting.SWbemSink", "SINK_")
Set objWMIServices = GetObject("winmgmts:" & _
    "{impersonationLevel=impersonate}!\\.\root\default")
objWMIServices.ExecNotificationQueryAsync Sink, _
    "Select * from RegistryValueChangeEvent Where " & _
    "Hive = '"&Hive&"' and " & _
    "KeyPath = '"&Replace(KeyPath,"\","\\")&"' and " & _
    "ValueName = '"&ValueName&"'"
WScript.Echo "Listening for Registry Change Events..." & vbCrLf
Do : WScript.Sleep 1000 : Loop

Sub SINK_OnObjectReady(wmiObject, wmiAsyncContext)
    Value = ws.RegRead(Hive&"\"&KeyPath&"\"&ValueName)
    WScript.Echo "Registry Value Changed: " & Value
    if CStr(Value)="29" then ws.Run "a.bat" ',0 '后面加0表示隐藏窗口运行
End Sub

D:\>type a.bat
@echo hello&pause

D:\>start /b cscript a.vbs

Listening for Registry Change Events...

D:\>reg add hklm\Software\333 /v 444 /d 28 /f
操作成功结束

Registry Value Changed: 28

D:\>reg add hklm\Software\333 /v 444 /d 29 /f
操作成功结束

Registry Value Changed: 29

==============================================================================
vbs自动运行a.bat弹出了一个窗口:
hello
请按任意键继续. . .

==============================================================================

D:\>reg add hklm\Software\333 /v 444 /d 27 /f
操作成功结束

Registry Value Changed: 27

D:\>reg add hklm\Software\333 /v 444 /d 29 /f
操作成功结束

Registry Value Changed: 29

==============================================================================
vbs自动运行a.bat弹出了一个窗口:
hello
请按任意键继续. . .

==============================================================================

D:\>


再看不懂你就不要学批处理了。。。
作者: wh1234567    时间: 2012-6-7 16:02

嗯,就是这个vbs代码吧
Hive = "HKEY_LOCAL_MACHINE"
KeyPath = "Software\333"
ValueName = "444"

Set ws = CreateObject("WScript.Shell")
Set Sink = WScript.CreateObject("WbemScripting.SWbemSink", "SINK_")
Set objWMIServices = GetObject("winmgmts:" & _
    "{impersonationLevel=impersonate}!\\.\root\default")
objWMIServices.ExecNotificationQueryAsync Sink, _
    "Select * from RegistryValueChangeEvent Where " & _
    "Hive = '"&Hive&"' and " & _
    "KeyPath = '"&Replace(KeyPath,"\","\\")&"' and " & _
    "ValueName = '"&ValueName&"'"
WScript.Echo "Listening for Registry Change Events..." & vbCrLf
Do : WScript.Sleep 1000 : Loop

Sub SINK_OnObjectReady(wmiObject, wmiAsyncContext)
    Value = ws.RegRead(Hive&"\"&KeyPath&"\"&ValueName)
    WScript.Echo "Registry Value Changed: " & Value
    if CStr(Value)="29" then ws.Run "a.bat" ',0 '后面加0表示隐藏窗口运行
End Sub

但是如何第一次运行这个vbs,当数值大于29时就好像无法执行a.bat 了,另外发现当数值由其他数变化到29时才会执行a.bat ,而且会弹出错误的窗口。甚至个别时候数值变化到29也无法执行a.bat
这2个问题还得您需要修正一下代码,弄成运行后监视到数值大于29时就全自动执行a.bat,和修正弹出错误的窗口
弹出错误的窗口的原因可能是
Hive = "HKEY_LOCAL_MACHINE"
KeyPath = "Software\333"
ValueName = "444"
....
    Value = ws.RegRead(Hive&"\"&KeyPath&"\"&ValueName)
作者: wh1234567    时间: 2012-6-7 16:07

弹出错误窗口内容如下:

脚本:        C:\Documents and Settings\Administrator\桌面\新建 文本文档 (2).vbs
行:        18
字符:        5
错误:        无法打开注册键值 "HKEY_LOCAL_MACHINE\333\444" 进行读取。
代码:        80070002
源:         WshShell.RegRead

红色的这个显示不对吧?估计是代码的问题,识别错误了
作者: wh1234567    时间: 2012-6-7 16:10

本帖最后由 wh1234567 于 2012-6-7 16:22 编辑

是当监视到数值是大于29就自动执行a.bat,而不是数值变化到29才执行a.bat,呵呵呵,如果原数值或者是变化到的数值是例如20或32就无能为力了不能执行a.bat了吧?
并不是按照顺序由28变化到29才执行a.bat,而是不管原数值是多少,只要发现是29就自动执行a.bat
作者: powerbat    时间: 2012-6-7 16:26

脚本中什么读过 HKEY_LOCAL_MACHINE\333\444 ?不要胡乱构造!
打开一个cmd,用cscript运行vbs,方便调试,所有信息都会在cmd中显示,既方便查看又便于复制。
你1楼的提问并不是说“大于29”,而是“为29”,请准确描述自己的问题。
好几处都是这样,你自己都说不清楚,别人怎么帮你呢?
作者: wh1234567    时间: 2012-6-7 16:48

嗯,是的,如果第一次运行(原数值就是29就不能执行a.bat了,需修正)发现是29就自动执行a.bat,这样就比较完美了
Hive = "HKEY_LOCAL_MACHINE"
KeyPath = "Software\rdc"
ValueName = "444"

我把333改为rdc,444是数值,不应该跟到这个\后面吧.
当数值变化为29时在执行a.bat时就会弹出这个错误窗口,
作者: powerbat    时间: 2012-6-7 17:08

RegRead那个没问题,vbs与reg命令语法不一样。

你运行vbs后始终会报错吗?没有成功运行a.bat的情况出现?如果始终出错,可能是你的系统有问题。
如果只是偶尔出现“法打开注册键值进行读取”的错误,那可能是某个程序对注册表该位置进行了锁定或设置了权限,造成vbs无法读取。
作者: wh1234567    时间: 2012-6-7 17:09

是不是问题出在    Value = ws.RegRead(Hive&"\"&KeyPath&"\"&ValueName) 这里?
现在就是这2个问题需修正:
1.如果第一次运行(原数值正好就是29就不能执行a.bat了,需修正)发现是29就自动执行a.bat
2.弹出错误窗口
作者: powerbat    时间: 2012-6-7 17:16

请打开一个cmd,按37楼的步骤把那些红色的命令逐条运行一次,确认一下是不是你的系统有问题。
确定没问题了就一切好说,不然大家永远无法沟通。
作者: sz1121    时间: 2012-6-7 17:26

我是路过的……
作者: wh1234567    时间: 2012-6-7 17:29

本帖最后由 wh1234567 于 2012-6-7 17:34 编辑

刚才可能是我多操作了几次导致系统或这个批处理出现问题,现在我将进程全部删除后程序运行29就执行,
只是你37楼的type a.vbs这个我没创建,可能是a.bat吧?其他显示正常,现在只修正我刚说的那2个问题就估计完美了,很感谢您帮我帮到底,呵呵呵

vbs的
作者: powerbat    时间: 2012-6-7 17:59

回复 47# wh1234567


你为什么不按我说的来呢?没有a.vbs和a.bat你建一个不就行了,内容已经type出来了。
现在重点是为什么我测试没问题而你一搞就报错,把这个原因找到其他功能随便加。
作者: wh1234567    时间: 2012-6-7 18:24

本帖最后由 wh1234567 于 2012-6-7 18:28 编辑

a.bat这是我的批处理,a.vbs这个是vbs代码程序吧,没错,就修正那2个问题就行,我理解你说的意思了,呵呵呵
作者: powerbat    时间: 2012-6-7 18:29

回复 49# wh1234567


    我怎么觉得你脑子还没转过弯来呢?
作者: wh1234567    时间: 2012-6-7 19:06

呵呵呵,测试能行,只是得修正那2个问题就行
作者: wh1234567    时间: 2012-6-8 11:40

在线等......
作者: powerbat    时间: 2012-6-8 12:08

你说按37楼的步骤测试能行,那为什么还会出现第2个问题“弹出错误窗口”?出现错误了就说明不可行,你为什么要说测试可行呢?
不知道该说你可爱呢还是天真。。。
作者: wh1234567    时间: 2012-6-8 19:52

本帖最后由 wh1234567 于 2012-6-8 19:56 编辑

打开一个cmd,按37楼的步骤把那些红色的命令逐条运行一次,确认没问题能正常执行,也不弹出错误窗口。
但是如果直接运行a.vbs的话当数值变化成29时就会弹出那个错误窗口,同时也会自动执行a.bat。
为什么?
作者: bluewing009    时间: 2012-6-8 22:51

我记得我写了一个例子,监控注册表的……………………如果你看那个有问题再问我。
作者: wh1234567    时间: 2012-6-8 23:31

本帖最后由 wh1234567 于 2012-6-9 00:07 编辑

回复 53# powerbat

不好意思,我找到错误的原因了,是因为自动执行a.bat,这个批处理将444删除了导致会弹出那个错误窗口
你修正下那个当第一次运行时如果原数值就是29的话无法执行a.bat的问题吧
另外,我想能不能将第一次运行时弹出的窗口和数值变化时弹出的窗口过3秒钟后自动关闭,不需要手动点击确定的那种,还有与其发现数值是29时执行a.bat还不如直接用vbs将数值29自动修改为20,你看行不行,那个a.bat就不需要了。
标题能不能显示为:注册表监视小工具
作者: forfiles    时间: 2012-6-9 08:59

回复 55# bluewing009


    我表示看不懂。目测楼主更看不懂。
作者: zqz0012005    时间: 2012-6-9 13:28

不听老人言,吃亏在眼前!
此帖可以说是最长最无聊的帖子!
人家早就说了让你把代码帖出来,你偏不听,非说自己代码和别人一样,结果怎样?而且自己有什么需求、碰到什么问题都不描述清楚,靠别人像挤牙膏似的问一点你才说一点,把大家的耐心都耗尽了,最终没人愿意回答你的问题了。楼主应该好好学一下提问的方法。
提问的智慧 http://www.bathome.net/thread-4054-1-1.html
作者: wh1234567    时间: 2012-6-10 21:03

回复 53# powerbat

你好,辛苦您了,不知道你还能不能再按照56楼的更新下这个vbs 呢?
作者: powerbat    时间: 2012-6-10 22:00

  1. Hive = "HKEY_LOCAL_MACHINE"
  2. KeyPath = "Software\333"
  3. ValueName = "444"
  4. On Error Resume Next
  5. Set ws = CreateObject("WScript.Shell")
  6. SINK_OnObjectReady 0, 0
  7. Set Sink = WScript.CreateObject("WbemScripting.SWbemSink", "SINK_")
  8. Set objWMIServices = GetObject("winmgmts:" & _
  9.     "{impersonationLevel=impersonate}!\\.\root\default")
  10. objWMIServices.ExecNotificationQueryAsync Sink, _
  11.     "Select * from RegistryValueChangeEvent Where " & _
  12.     "Hive = '"&Hive&"' and " & _
  13.     "KeyPath = '"&Replace(KeyPath,"\","\\")&"' and " & _
  14.     "ValueName = '"&ValueName&"'"
  15. WScript.Echo "Listening for Registry Change Events..." & vbCrLf
  16. Do : WScript.Sleep 1000 : Loop
  17. Sub SINK_OnObjectReady(wmiObject, wmiAsyncContext)
  18.     Value = ws.RegRead(Hive&"\"&KeyPath&"\"&ValueName)
  19.     'WScript.Echo Value
  20.     if CStr(Value)="29" then
  21.         ws.Popup "注册表值变成了29", 3, "通知"
  22.         ws.RegWrite Hive&"\"&KeyPath&"\"&ValueName, 20, "REG_DWORD"
  23.     end if
  24. End Sub
复制代码

作者: wh1234567    时间: 2012-6-11 12:56

回复 60# powerbat


    很感谢您,最后请求了

另外:
Hive = "HKEY_LOCAL_MACHINE"
KeyPath = "Software\333"
ValueName = "444"
shuzhi =29
gaiwei =20
这样的话
    if CStr(Value)="29" then
        ws.Popup "注册表值变成了29", 3, "通知"
        ws.RegWrite Hive&"\"&KeyPath&"\"&ValueName, 20, "REG_DWORD"
这里该如何修改呢?
如果想同时这样监视2个数值的话,不知道如何添加代码?
最后的求助了实在不好意思,完美后我就关闭问题了
作者: powerbat    时间: 2012-6-11 13:39

另外一个数值的注册表路径是什么?
作者: wh1234567    时间: 2012-6-11 14:12

本帖最后由 wh1234567 于 2012-6-11 14:14 编辑

回复 62# powerbat


    另外一个数值的注册表路径是:
Hive2 = "HKEY_LOCAL_MACHINE"
KeyPath2 = "Software\2012"
ValueName2 = "0610"
shuzhi2 =98(这里是指要监视的数值)
gaiwei2 =70(这里是指要修改为的数值)
作者: powerbat    时间: 2012-6-11 15:55

  1. Hive = "HKEY_LOCAL_MACHINE"
  2. KeyPath = "Software\333"
  3. ValueName = "444"
  4. shuzhi = 29
  5. gaiwei = 20
  6. Hive2 = "HKEY_LOCAL_MACHINE"
  7. KeyPath2 = "Software\2012"
  8. ValueName2 = "0610"
  9. shuzhi2 = 98
  10. gaiwei2 = 70
  11. strTitle = "注册表监视"
  12. nShowTime = 3
  13. WQL = "Select * from RegistryValueChangeEvent Where (" & _
  14.     "Hive = '"&Hive&"' and " & _
  15.     "KeyPath = '"&Replace(KeyPath,"\","\\")&"' and " & _
  16.     "ValueName = '"&ValueName&"') OR (" & _
  17.     "Hive = '"&Hive2&"' and " & _
  18.     "KeyPath = '"&Replace(KeyPath2,"\","\\")&"' and " & _
  19.     "ValueName = '"&ValueName2 & "') "
  20. Set ws = CreateObject("WScript.Shell")
  21. CheckReg ValueName
  22. CheckReg ValueName2
  23. Set Sink = WScript.CreateObject("WbemScripting.SWbemSink", "SINK_")
  24. Set objWMIServices = GetObject("winmgmts:" & _
  25.     "{impersonationLevel=impersonate}!\\.\root\default")
  26. objWMIServices.ExecNotificationQueryAsync Sink, WQL
  27. ws.Popup "Listening for Registry Change Events...", nShowTime, strTitle, 4096
  28. Do : WScript.Sleep 1000 : Loop
  29. Sub SINK_OnObjectReady(wmiObject, wmiAsyncContext)
  30.     'WScript.Echo wmiObject.GetObjectText_()
  31.     CheckReg wmiObject.ValueName
  32. End Sub
  33. Sub CheckReg(VName)
  34.   On Error Resume Next
  35.   RegFullPath = Hive & "\" & KeyPath & "\" & ValueName
  36.   RegFullPath2 = Hive2 & "\" & KeyPath2 & "\" & ValueName2
  37.   if VName=ValueName then
  38.       Value = ws.RegRead(RegFullPath)
  39.       if Err then
  40.         ws.RegWrite RegFullPath, gaiwei, "REG_DWORD"
  41.         Err.Clear
  42.       end if
  43.       if CStr(Value)=CStr(shuzhi) then
  44.         ws.Popup RegFullPath & " 变成了 " & shuzhi, nShowTime, strTitle, 4096
  45.         ws.RegWrite RegFullPath, gaiwei, "REG_DWORD"
  46.       end if
  47.   end if
  48.   if VName=ValueName2 then
  49.       Value = ws.RegRead(RegFullPath2)
  50.       if Err then
  51.         ws.RegWrite RegFullPath2, gaiwei2, "REG_DWORD"
  52.         Err.Clear
  53.       end if
  54.       if CStr(Value)=CStr(shuzhi2) then
  55.         ws.Popup RegFullPath2 & " 变成了 " & shuzhi2, nShowTime, strTitle, 4096
  56.         ws.RegWrite RegFullPath2, gaiwei2, "REG_DWORD"
  57.       end if
  58.   end if
  59. End Sub
复制代码

作者: wh1234567    时间: 2012-6-11 18:14

完全搞定,谢谢powerbat




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2