Question

Je suis un débutant sur WMI et je dois implémenter RegistryValueChangeEvent dans un service C #.

J'ai besoin d'un gestionnaire d'événements qui soit déclenché à chaque fois que l'une des valeurs d'un registre est modifiée. Je souhaite un comportement similaire à celui de la classe FileSystemWatcher . = "http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.changed.aspx" rel = "noreferrer"> Événement modifié, mais pour les valeurs de registre.

S'il existe une autre technique que je pourrais utiliser pour accomplir la même tâche, je l'apprécierais également. Mon exigence minimum est que cette solution soit meilleure que celle que j'ai actuellement: interroger toutes les 20 secondes et comparer la valeur de registre au dernier résultat.

Veuillez fournir un exemple de code dans votre réponse. Si je peux obtenir un exemple pour surveiller une seule valeur de registre, ce serait très bien.

J'ai besoin d'une solution en .Net 2.0

Merci.

Était-ce utile?

La solution

Il peut parfois être intéressant de travailler avec WMI ... Je pense que j'ai bien compris votre question. Regardez donc l'extrait de code ci-dessous et dites-moi si c'est ce que vous recherchez.

// --------------------------------------------------------------------------------------------------------------------- 
// <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();
        }
    }
}

Autres conseils

Êtes-vous limité à WMI? Sinon, vous pouvez utiliser les RegNotifyChangeKeyValue comme RegistryMonitor

Vous n'avez vraiment pas besoin de WMI, comme d'autres l'ont souligné. Moi aussi j'ai utilisé RegistryMonitor sans aucun problème.

Si vous avez besoin d'un exemple, il existe déjà un exemple de code pour RegistryMonitor sur la page elle-même. Avez-vous fait défiler jusqu’à ce bit dans le projet de code:

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");
    }
}

Vous devrez utiliser WMI pour cela. Voir http://msdn.microsoft.com/en-us/library/aa393035 .aspx

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top