2009-05-05 12 views
18

Ich bin ein Neuling für WMI und ich muss RegistryValueChangeEvent in einem C# -Dienst implementieren.Registry Watcher C#

Ich brauche einen Event-Handler, der jedes Mal ausgelöst wird, wenn einer der Registrierungswerte geändert wird. Ich möchte Verhalten ähnlich dem Changed Ereignis, aber für Registrierungswerte.

Wenn es eine andere Technik gibt, die ich verwenden könnte, um die gleiche Aufgabe zu erfüllen, würde ich das auch schätzen. Meine Mindestanforderung ist, dass es eine bessere Lösung ist als das, was ich jetzt habe: alle 20 Sekunden abfragen und den Registrierungswert mit dem letzten Ergebnis vergleichen.

Bitte geben Sie den Beispielcode in Ihrer Antwort an. Wenn ich ein Beispiel dafür bekommen könnte, nur einen Registrierungswert zu sehen, wäre das in Ordnung.

brauche ich eine Lösung in .Net 2.0

Dank.

Antwort

24

WMI kann manchmal interessant sein, mit zu arbeiten ... Ich glaube, ich verstehe Ihre Frage, so einen Blick auf den Code-Schnipsel nehmen unten und lassen Sie mich wissen, ob es was Sie‘ suchend.

// --------------------------------------------------------------------------------------------------------------------- 
// <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

Das ist genau das, was ich suche. Ich werde es ausprobieren und Sie wissen lassen, wie es funktioniert. –

+0

Großartig, Andrew. Lassen Sie es mich wissen, wenn Sie Probleme haben, es für den eigenen Gebrauch zu verwenden. Sie können mich auf AIM anpingen, wenn Sie wollen - e4lt0rf3R (ersetzen Sie die Zahlen durch Buchstaben). Ich werde glücklich sein, Ihnen zu helfen, irgendwelche zusätzlichen Fragen zu lösen, die Sie haben, und dann eine Zusammenfassung von ihnen hier zu posten. –

+0

Sorry für das Kommentieren einer "alten" Antwort, aber gibt es einen Weg durch dieses Beispiel, der für HKEY_CURRENT_USER funktioniert – SomeNickName

0

Sie müssen WMI dafür verwenden. Siehe http://msdn.microsoft.com/en-us/library/aa393035.aspx

+0

Ha ... Ich weiß. Das ist der Teil, mit dem ich Hilfe brauche. –

+0

Ich habe den Wortlaut meiner Frage so geändert, dass er widerspiegelt, was ich wirklich brauche. Irgendwelche zusätzliche Hilfe? –

3

Sind Sie auf WMI beschränkt? Wenn nicht, können Sie RegNotifyChangeKeyValue Wrapper wie RegistryMonitor

+0

Nein Ich bin nicht auf WMI beschränkt, das ist die einzige Methode, die ich zum Zeitpunkt der Veröffentlichung kannte. Danke für die Links. Sie sind hilfreich. Können Sie einen Beispielcode bereitstellen? –

+1

Sind Sie wirklich so faul, dass Sie nicht auf den RegistryMonitor-Link klicken und die ZIP-Datei von CodeProject herunterladen können? –

+2

Lasst uns nicht unhöflich sein, Leute. Die Frage fragte zum Beispiel Code; Es muss auch berücksichtigt werden, dass einige Links veraltet sind und der Code in diesem Fall auf absehbare Zeit archiviert wird. :) –

2

Sie benötigen WMI wirklich nicht, wie andere darauf hingewiesen haben. Ich habe auch RegistryMonitor ohne Probleme verwendet.

Wenn Sie ein Beispiel benötigen, gibt es bereits Beispielcode für den RegistryMonitor auf der Seite selbst. Haben Sie bis zum folgenden Bit im Code-Projekt geblättert:

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

Ja, habe ich, aber ... es entspricht nicht den Anforderungen meiner Frage. Ich benötige Beispielcode für ein Ereignis, das ausgelöst wird, wenn eine bestimmte Registrierung _VALUE_ geändert wird; kein Schlüssel. Ich verstehe, dass ich das von RegistryMonitor bekommen kann, aber wenn jemand meine Zeit sparen will, haben sie eine Menge zu gewinnen. –