Registry Watcher C #

Soy un novato en WMI y necesito implementar RegistryValueChangeEvent en un servicio de C #.

Necesito un controlador de eventos que se active cada vez que se modifique cualquiera de un conjunto de valores de registro. Quiero un comportamiento similar al evento Changed de la clase FileSystemWatcher , pero para valores de registro.

Si hay alguna otra técnica que podría usar para realizar la misma tarea, también lo apreciaría. Mi requisito mínimo es que sea una solución mejor que la que tengo ahora: sondear cada 20 segundos y comparar el valor del registro con el último resultado.

Proporcione un código de ejemplo en su respuesta. Si puedo obtener un ejemplo para ver solo un valor de registro, estaría bien.

Necesito una solución en .Net 2.0

Gracias.

WMI a veces puede ser interesante para trabajar con … Creo que entiendo tu pregunta, así que eche un vistazo al fragmento de código a continuación y avíseme si es lo que está buscando.

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

¿Estás limitado a WMI? Si no, puede usar los contenedores RegNotifyChangeKeyValue como RegistryMonitor

Realmente no necesitas WMI, como otros han señalado. Yo también he usado RegistryMonitor sin problemas.

Si necesita un ejemplo, ya hay un código de ejemplo para RegistryMonitor en la página. ¿Se desplazó hacia abajo a este bit en el proyecto de código:

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

Necesitarás utilizar WMI para ello. Ver http://msdn.microsoft.com/en-us/library/aa393035.aspx