Registro Watcher C #

Sono un novizio di WMI e ho bisogno di implementare RegistryValueChangeEvent in un servizio C #.

Ho bisogno di un gestore di eventi che venga triggersto ogni volta che viene modificato uno qualsiasi dei valori del Registro di sistema. Voglio un comportamento simile all’evento Changed della class FileSystemWatcher , ma per i valori di registro.

Se c’è qualche altra tecnica che potrei usare per compiere lo stesso compito, lo apprezzerei anche io. Il mio requisito minimo è che sia una soluzione migliore di quella che ho ora: il polling ogni 20 secondi e il confronto del valore del registro con l’ultimo risultato.

Fornire il codice di esempio nella risposta. Se riesco a ottenere un esempio per la visualizzazione di un solo valore di registro, andrebbe bene.

Ho bisogno di una soluzione in .Net 2.0

Grazie.

WMI a volte può essere interessante con cui lavorare … Credo di capire la tua domanda, quindi dai uno sguardo al frammento di codice qui sotto e fammi sapere se è quello che stai cercando.

// --------------------------------------------------------------------------------------------------------------------- //  // //  //  // Defines the WmiChangeEventTester type. //  // --------------------------------------------------------------------------------------------------------------------- namespace WmiExample { using System; using System.Management; ///  ///  public class WmiChangeEventTester { ///  /// Initializes a new instance of the  class. ///  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); } } ///  ///  ///  /// The sender. ///  ///  /// The e. ///  private void HandleEvent(object sender, EventArrivedEventArgs e) { Console.WriteLine("Received an event."); // RegistryKeyChangeEvent occurs here; do something. } ///  ///  public static void Main() { // Just calls the class above to check for events... WmiChangeEventTester receiveEvent = new WmiChangeEventTester(); } } } 

Sei limitato a WMI? In caso contrario, è ansible utilizzare i wrapper RegNotifyChangeKeyValue come RegistryMonitor

Non hai davvero bisogno di WMI, come altri hanno sottolineato. Anch’io ho usato RegistryMonitor senza problemi.

Se hai bisogno di un esempio, c’è già un codice di esempio per RegistryMonitor sulla pagina stessa. Ti sei limitato a questo bit nel progetto del codice:

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

Avrai bisogno di utilizzare WMI per questo. Vedi http://msdn.microsoft.com/en-us/library/aa393035.aspx