2009-05-05 4 views
18

Je suis un débutant à WMI et j'ai besoin de mettre en œuvre RegistryValueChangeEvent dans un service C#.Registre Watcher C#

J'ai besoin d'un gestionnaire d'événements qui se déclenche chaque fois que l'un des ensembles de valeurs de registre est modifié. Je veux un comportement similaire à l'événement Changed de la classe FileSystemWatcher, mais pour les valeurs de registre.

S'il y a une autre technique que je pourrais utiliser pour accomplir la même tâche, je l'apprécierais aussi. Mon exigence minimale est que ce soit une meilleure solution que ce que j'ai actuellement: interroger toutes les 20 secondes et comparer la valeur du registre avec le dernier résultat.

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

je besoin d'une solution dans .Net 2.0

Merci.

Répondre

24

WMI peut parfois être intéressant de travailler avec ... Je pense que je comprends votre question, alors jetez un oeil à l'extrait de code ci-dessous et laissez-moi savoir si c'est ce que vous » re cherche.

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

C'est exactement ce que je cherche. Je vais l'essayer et vous laisser savoir comment cela fonctionne. –

+0

Super, Andrew. Faites-moi savoir si vous avez de la difficulté à le réutiliser pour votre usage personnel. Vous pouvez me cingler sur AIM si vous voulez - e4lt0rf3R (remplacer les chiffres par des lettres). Je serai heureux de vous aider à résoudre toutes les questions supplémentaires que vous avez et ensuite poster un résumé d'entre eux ici. –

+0

Désolé de commenter une "ancienne" réponse, mais est-ce qu'il y a un chemin à travers cet exemple qui fonctionne pour HKEY_CURRENT_USER – SomeNickName

0

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

+0

Ha ... Je sais. C'est la partie avec laquelle j'ai besoin d'aide. –

+0

J'ai changé le libellé de ma question pour refléter ce dont j'ai vraiment besoin. Toute aide supplémentaire? –

3

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

+0

Non, je ne suis pas limité à WMI, c'est juste la seule méthode que je connaissais au moment de l'affichage. Merci pour les liens. Ils sont utiles. Pourriez-vous fournir un exemple de code? –

+1

Êtes-vous vraiment trop paresseux pour ne pas pouvoir cliquer sur le lien RegistryMonitor et télécharger le fichier zip de CodeProject ?? –

+2

Ne soyons pas impolis, les gars. La question a demandé un exemple de code; De plus, il faut garder à l'esprit que certains liens deviennent obsolètes et que des exemples de code seront archivés ici dans un avenir prévisible. :) –

2

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 y a déjà un exemple de code pour RegistryMonitor sur la page elle-même. Avez-vous fait défiler jusqu'à ce bit sur 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"); 
    } 
} 
+1

Oui je l'ai fait, mais ... il ne répond pas aux exigences de ma question. J'ai besoin d'un exemple de code pour un événement qui se déclenche lorsqu'un registre spécifique _VALUE_ est modifié; pas une clé. Je comprends que je peux obtenir cela de RegistryMonitor, mais si quelqu'un veut gagner du temps, il a beaucoup à gagner. –

Questions connexes