在RegistryKey Value更改时接收通知

时间:2010-11-20 16:36:12

标签: c# registry wmi notifications wbem

我希望在HKEY_CURRENT_USER中的特定RegistryKey发生更改时发出通知。 到目前为止,我通过WMI尝试了此操作但没有成功:

var query = new WqlEventQuery(string.Format(
"SELECT * FROM RegistryKeyChangeEvent WHERE Hive='{0}' AND KeyPath='{1}' AND ValueName='{2}'",
                hive, keyPath.Replace("\\","\\\\"), valueName));
_watcher = new ManagementEventWatcher(query);
_watcher.Scope.Path.NamespacePath = @"root\default";
_watcher.EventArrived += (sender, args) => KeyValueChanged();
_watcher.Start();

(错误是“未找到”)

我的第二种方法是使用WBEM Scripting COM component,意图将示例从http://msdn.microsoft.com/en-us/library/aa393042(VS.85).aspx移植到c#,但我没有在c#中找到WBEM COM的任何使用示例

我找到了这个http://www.codeproject.com/KB/system/registrymonitor.aspx类,但它不符合我的需要,因为这个类只监视整个键,我只想要一个特定值的通知(通过ValueName指定上面的样本变了。

编辑: 如果在msdn vbscript示例中将Hive更改为HKEY_CURRENT_USER,它将停止工作。我无法找到有关此行为的任何内容,但a link from 2003

EDIT2: HKEY_CLASSES_ROOT或从HKEY_CURRENT_USER派生的类不支持对RegistryEventRegistryValueChangeEvent配置单元的更改,例如{{1}}。 (MSDN

2 个答案:

答案 0 :(得分:13)

我终于解决了问题并使WMI查询版本正常工作:

var currentUser = WindowsIdentity.GetCurrent();
var query = new WqlEventQuery(string.Format(
"SELECT * FROM RegistryValueChangeEvent WHERE Hive='HKEY_USERS' AND KeyPath='{0}\\\\{1}' AND ValueName='{2}'",
currentUser.User.Value, keyPath.Replace("\\","\\\\"), valueName));
_watcher = new ManagementEventWatcher(query);
_watcher.EventArrived += (sender, args) => KeyValueChanged();
_watcher.Start();

我在http://www.codeproject.com/Messages/2844468/Monitoring-HKEY_CURRENT_USER.aspx

发现了这个“黑客”

答案 1 :(得分:0)

上传到pastbin这是一个很好的类。希望它符合您的需求。

http://www.csharp.pastebin.com/0reFh6v2