You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何确定Windows注册表中哪个键值项发生了变更

问题

RegNotifyChangeKeyValue() 函数可检测到注册表发生了某种变更,如何确定具体是哪个键值项发生了变更?(无需对比变更前后的整个注册表状态)


更新:已尝试的方法

1. RegNotifyChangeKeyValue()

import winreg
import ctypes
advapi32 = ctypes.WinDLL("Advapi32.dll")

hive = winreg.HKEY_LOCAL_MACHINE
key_path = r""
event = ctypes.windll.kernel32.CreateEventW(None, True, False, None)
rc = advapi32.RegNotifyChangeKeyValue(
    key.handle,
    True,  # 监控子键
    REG_NOTIFY_CHANGE_NAME | REG_NOTIFY_CHANGE_LAST_SET,
    event,
    True   # 异步模式
) # -> int

该方法可监控整个子键树,但无法告知具体是哪个子键发生了变更。

2. WMI 的 RegistryKeyChangeEvent

它仅能监控单个键值项。若尝试不设置AND KeyPath='...'会出现报错:

>>> from win32com.client import GetObject
>>> wmi = GetObject("winmgmts:\\.\root\default")
>>> wmi.ExecNotificationQuery("SELECT * FROM RegistryKeyChangeEvent WHERE Hive='HKEY_LOCAL_MACHINE' ")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<COMObject winmgmts:\.\root\default>", line 2, in ExecNotificationQuery
  File "C:\Users\FeelUs\miniforge3\envs\py12\Lib\site-packages\win32com\client\dynamic.py", line 355, in _ApplyTypes_
    result = self._oleobj_.InvokeTypes(
             ^^^^^^^^^^^^^^^^^^^^^^^^^^
pywintypes.com_error: (-2147352567, 'Error.', (0, 'SWbemServicesEx', 'Provider registration overlaps with the system event domain ', None, 0, -2147213311), None)

当前使用的pywin32版本信息:

(py12) C:\Users\FeelUs\tmp\files-db>pip show pywin32
Name: pywin32
Version: 307
Summary: Python for Window Extensions
Author: Mark Hammond (et al)
Author-email: mhammond@skippinet.com.au
License: PSF
Location: C:\Users\FeelUs\miniforge3\envs\py12\Lib\site-packages
Requires:
Required-by: jupyter_core, plumbum, pypiwin32, WMI

报错出现在win32com\client\dynamic.py第336行。

3. WMI 的 RegistryTreeChangeEvent

from win32com.client import GetObject
wmi = GetObject("winmgmts:\\.\root\default")
watcher = wmi.ExecNotificationQuery(
    "SELECT * FROM RegistryTreeChangeEvent"
    "WHERE Hive = 'HKEY_LOCAL_MACHINE' AND RootPath = '' "
)
while True:
    event = watcher.NextEvent()
    print(event.Path_) # -> <COMObject <unknown>>
    print(event.Path_.Path) # -> '' for any path

其表现与RegNotifyChangeKeyValue类似:事件无法告知具体哪个子键发生了变更。

4. 创建并安装注册表过滤驱动

需要在Visual Studio中编译、进行数字签名、安装……这对于该任务来说过于繁琐,是否有更简便的方法?


内容的提问来源于stack exchange,提问作者Филя Усков

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 20:52:42