【问题标题】:RegistryTreeChangeEvent via C# & WMIRegistryTreeChangeEvent 通过 C# & WMI
【发布时间】:2010-07-28 17:36:26
【问题描述】:

我收到此错误:

未处理的异常:System.Runtime.InteropServices.COMException (0x80042001):来自 HRESULT 的异常:0x80042001 在 System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32 错误代码,IntPtr 错误信息) 在 System.Management.ManagementEventWatcher.Start() 在 {somedir}\Program.cs:line 16 中的 MyNamespace.Program.Main(String[] args)

这是我用来查看注册表的 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;
        }
    }
}

}

我试图简单地观察注册表的变化。有人对为什么失败有任何建议吗?

【问题讨论】:

    标签: c# windows wmi registry


    【解决方案1】:

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

    这是一个很好的错误消息,因为您永远不会离开 COM。令人惊讶的是 .NET 异常消息有多好。 Anyhoo,我很确定这意味着“您要求的事件太多了”。您必须在查询中更具选择性,使用 WHERE 子句。喜欢:

    从 RegistryTreeChangeEvent 中选择 *
    WHERE Hive='HKEY_LOCAL_MACHINE' 和 'RootPath='SOFTWARE\Microsoft'


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

    以下是错误注册的示例。

    从 RegistryTreeChangeEvent 中选择 * WHERE hive = hkey_local_machine" 或 根路径="软件"

    由于无法评估每个属性的可能值,WMI 拒绝任何没有 WHERE 子句或 WHERE 子句太宽而无用的查询,并返回错误 WBEM_E_TOO_BROAD。

    【讨论】:

    • 这很有趣。我想知道为什么这个答案被否决了。
    • 实际上,文档确实指出,如果没有 where 子句,您将收到此错误。
    【解决方案2】:

    正如 Hans 所说,您收到错误是因为您没有指定 where 子句。根据Creating a Proper WHERE Clause for the Registry Provider,您必须指定 where 子句,否则您将收到 WBEM_E_TOO_BROAD 错误。

    为了简化代码而不是重新发明轮子,您可以使用以下库:Asynchronous Registry Notification Using Strongly-typed WMI Classes in .NET

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-29
      • 1970-01-01
      • 2019-07-04
      • 1970-01-01
      相关资源
      最近更新 更多