Registry Watcher C # - PullRequest
       48

Registry Watcher C #

20 голосов
/ 06 мая 2009

Я новичок в WMI, и мне нужно внедрить RegistryValueChangeEvent в службу C #.

Мне нужен обработчик событий, который запускается каждый раз, когда изменяется любое из значений реестра. Мне нужно поведение, подобное FileSystemWatcher класса Измененное событие , но для значений реестра.

Если бы была какая-то другая техника, которую я мог бы использовать для выполнения той же задачи, я был бы также признателен за это. Мое минимальное требование - это лучшее решение, чем у меня сейчас: опрос каждые 20 секунд и сравнение значения реестра с последним результатом.

Пожалуйста, укажите пример кода в вашем ответе. Если бы я мог получить пример для просмотра только одного значения реестра, это было бы хорошо.

Мне нужно решение в .Net 2.0

Спасибо.

Ответы [ 4 ]

27 голосов
/ 11 мая 2009

WMI иногда может быть интересным для работы ... Я думаю, я понимаю ваш вопрос, поэтому взгляните на фрагмент кода ниже и дайте мне знать, если это то, что вы ищете.

// --------------------------------------------------------------------------------------------------------------------- 
// <copyright file="Program.cs" company="">
//   
// </copyright>
// <summary>
//   Defines the WmiChangeEventTester type.
// </summary>
// ---------------------------------------------------------------------------------------------------------------------
namespace WmiExample
{
    using System;
    using System.Management;

    /// <summary>
    /// </summary>
    public class WmiChangeEventTester
    {
        /// <summary>
        /// Initializes a new instance of the <see cref="WmiChangeEventTester"/> class.
        /// </summary>
        public WmiChangeEventTester()
        {
            try
            {
                // Your query goes below; "KeyPath" is the key in the registry that you
                // want to monitor for changes. Make sure you escape the \ character.
                WqlEventQuery query = new WqlEventQuery(
                     "SELECT * FROM RegistryValueChangeEvent WHERE " +
                     "Hive = 'HKEY_LOCAL_MACHINE'" +
                     @"AND KeyPath = 'SOFTWARE\\Microsoft\\.NETFramework' AND ValueName='InstallRoot'");

                ManagementEventWatcher watcher = new ManagementEventWatcher(query);
                Console.WriteLine("Waiting for an event...");

                // Set up the delegate that will handle the change event.
                watcher.EventArrived += new EventArrivedEventHandler(HandleEvent);

                // Start listening for events.
                watcher.Start();

                // Do something while waiting for events. In your application,
                // this would just be continuing business as usual.
                System.Threading.Thread.Sleep(100000000);

                // Stop listening for events.
                watcher.Stop();
            }
            catch (ManagementException managementException)
            {
                Console.WriteLine("An error occurred: " + managementException.Message);
            }
        }

        /// <summary>
        /// </summary>
        /// <param name="sender">
        /// The sender.
        /// </param>
        /// <param name="e">
        /// The e.
        /// </param>
        private void HandleEvent(object sender, EventArrivedEventArgs e)
        {
            Console.WriteLine("Received an event.");
            // RegistryKeyChangeEvent occurs here; do something.
        }

        /// <summary>
        /// </summary>
        public static void Main()
        {
            // Just calls the class above to check for events...
            WmiChangeEventTester receiveEvent = new WmiChangeEventTester();
        }
    }
}
3 голосов
/ 11 мая 2009

Вы ограничены WMI? Если нет, вы можете использовать RegNotifyChangeKeyValue оболочки типа RegistryMonitor

2 голосов
/ 14 мая 2009

Вам действительно не нужен WMI, как указали другие. Я тоже использовал RegistryMonitor без проблем.

Если вам нужен пример, то уже есть пример кода для RegistryMonitor на самой странице. Прокрутили ли вы до этого бита в проекте кода:

public class MonitorSample
{
    static void Main() 
    {
        RegistryMonitor monitor = new 
          RegistryMonitor(RegistryHive.CurrentUser, "Environment");
        monitor.RegChanged += new EventHandler(OnRegChanged);
        monitor.Start();

        while(true);

        monitor.Stop();
    }

    private void OnRegChanged(object sender, EventArgs e)
    {
        Console.WriteLine("registry key has changed");
    }
}
0 голосов
/ 06 мая 2009

Вам нужно будет использовать WMI для этого. Смотри http://msdn.microsoft.com/en-us/library/aa393035.aspx

...