RegistryTreeChangeEvent через C # и WMI - PullRequest
3 голосов
/ 28 июля 2010

Я получаю эту ошибку:

Необработанное исключение: System.Runtime.InteropServices.COMException (0x80042001): Исключение из HRESULT: 0x80042001 в System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal (Int32trtr,errorInfo) в System.Management.ManagementEventWatcher.Start () в MyNamespace.Program.Main (String [] args) в {somedir} \ Program.cs: строка 16

А вот мое консольное приложение 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;
        }
    }
}

}

Я пытаюсь просто посмотреть реестр на наличие изменений.У кого-нибудь есть предложения относительно того, почему это не удается?

Ответы [ 2 ]

4 голосов
/ 28 июля 2010

Это внутренняя ошибка WMI, WBEMESS_E_REGISTRATION_TOO_BROAD, «Регистрация поставщика перекрывается с доменом системных событий.»

Это хорошее сообщение об ошибке, которое вы когда-либо выходили из COM.Поразительно, насколько лучше сообщения об исключениях .NET.Anyhoo, я вполне уверен, что это означает, что «вы просите слишком много событий».Вам нужно быть более избирательным в своем запросе, используйте предложение WHERE.Как:

SELECT * FROM RegistryTreeChangeEventГДЕ Hive = 'HKEY_LOCAL_MACHINE' И 'RootPath =' ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ \ Microsoft '


По запросу Джорджа я обнаружил MSDN-страницу , в которой описана проблема:

Ниже приведен пример неправильной регистрации.

SELECT * FROM RegistryTreeChangeEvent WHERE hive = hkey_local_machine "ИЛИ rootpath =" software "

Поскольку нет способа оценитьвозможные значения для каждого из свойств, WMI отклоняет с ошибкой WBEM_E_TOO_BROAD любой запрос, у которого либо нет предложения WHERE, либо предложение WHERE слишком широкое, чтобы его можно было использовать.

1 голос
/ 28 июля 2010

Как сказал Ганс, вы получаете сообщение об ошибке, потому что вы не указали пункт where.Согласно Создание правильного предложения WHERE для провайдера реестра вы должны указать условие where, в противном случае вы получите ошибку WBEM_E_TOO_BROAD.

Чтобы упростить код и не изобретать велосипед, вы можете использовать следующую библиотеку: Асинхронное уведомление реестра с использованием строго типизированных классов WMI в .NET

...