RegistryTreeChangeEvent通过C#&WMI

我得到这个错误:

未处理的exception:System.Runtime.InteropServices.COMException(0x80042001):exception从HRESULT:0x80042001在System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32 errorCode,IntPtr errorInfo)在System.Management.ManagementEventWatcher.Start()在MyNamespace.Program .main(String [] args)在{somedir} \ Program.cs中:第16行

这里是我用来观察registry的C#控制台应用程序:

using System; using System.Management; namespace MyNamespace { class Program { static void Main(string[] args) { var watcher = new ManagementEventWatcher(new WqlEventQuery("SELECT * FROM RegistryTreeChangeEvent")); var handler = new MyHandler(); watcher.EventArrived += handler.Arrived; //Start watching for events watcher.Start(); while (handler.EventHasntFiredYet) { // Nothing. } //Stop watching watcher.Stop(); } public class MyHandler { public bool EventHasntFiredYet; public MyHandler() { EventHasntFiredYet = true; } public void Arrived(object sender, EventArrivedEventArgs e) { var propertyDataCollection = e.NewEvent.Properties; foreach (var p in propertyDataCollection) { Console.WriteLine("{0} -- {1}",p.Name,p.Value); } EventHasntFiredYet = false; } } } 

}

我试图简单地观察registry的变化。 有没有人有任何build议,为什么这是失败?

这是内部WMI错误,WBEMESS_E_REGISTRATION_TOO_BROAD,“提供程序注册与系统事件域重叠”。

这是一个很好的错误消息,因为你会离开COM。 惊人的.NET异常消息是多好。 Anyhoo,我相当确定这是什么意思,“你要问太多的事情”。 您必须在查询中更具选择性,使用WHERE子句。 喜欢:

SELECT * FROM RegistryTreeChangeEvent
WHERE Hive ='HKEY_LOCAL_MACHINE'AND'RootPath ='SOFTWARE \ Microsoft'


在Giorgi的提示下,我找到了记录问题的MSDN页面 :

以下是一个不正确的注册的例子。

SELECT * FROM RegistryTreeChangeEvent WHERE hive = hkey_local_machine“OR rootpath =”software“

因为没有办法评估每个属性的可能值,所以WMI会拒绝错误WBEM_E_TOO_BROAD的任何查询,该查询或者没有WHERE子句,或者WHERE子句太宽泛以至于无法使用。

正如汉斯所说,由于您没有指定哪一条款,所以您收到了错误。 根据为注册表提供者创建适当的WHERE子句,您必须指定where子句,否则您将收到WBEM_E_TOO_BROAD错误。

为了简化你的代码,而不是重新发明轮子,你可以使用下面的库: 异步注册表通知在.NET中使用强类型的WMI类