2009-05-05 11 views
18

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

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

Si hay alguna otra técnica que podría utilizar para realizar la misma tarea, lo agradecería también. 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.

Indique el 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.

Respuesta

24

WMI a veces puede ser interesante trabajar con ... Creo que entiendo su pregunta, así que echar un vistazo a la siguiente fragmento de código y quiero saber si es lo que usted' que estas buscando.

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

Eso es exactamente lo que estoy buscando. Lo probaré y te haré saber cómo funciona. –

+0

Genial, Andrew. Avíseme si tiene problemas para volver a proponerlo para su propio uso. Puede hacer ping en AIM si lo desea: e4lt0rf3R (reemplace los números con letras). Estaré encantado de ayudarle a resolver cualquier pregunta adicional que tenga y luego publicar un resumen de ellos aquí. –

+0

Perdón por comentar una respuesta "anterior", pero, ¿hay alguna forma de que ese ejemplo funcione para HKEY_CURRENT_USER – SomeNickName

3

¿Está limitado a WMI? Si no se puede utilizar como envoltorios RegNotifyChangeKeyValueRegistryMonitor

+0

No, no estoy limitado a WMI, ese es el único método que conocía en el momento de la publicación. Gracias por los enlaces. Ellos son útiles. ¿Podrías proporcionar algún código de ejemplo? –

+1

¿Es realmente tan vago que no puede hacer clic en el enlace RegistryMonitor y descargar el archivo zip de CodeProject? –

+2

No seamos groseros, chicos. La pregunta solicitó un código de ejemplo; también, hay que tener en cuenta que algunos enlaces se vuelven obsoletos y el código de ejemplo se archivará aquí en el futuro previsible. :) –

2

Realmente no necesita WMI, como han señalado otros. 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"); 
    } 
} 
+1

Sí, lo hice, pero ... no cumple con los requisitos de mi pregunta. Necesito un código de ejemplo para un evento que se activa cuando se cambia un registro específico _VALOR_; no es una llave Entiendo que puedo obtenerlo de RegistryMonitor, pero si alguien quiere ahorrar mi tiempo, tienen mucho que ganar. –

Cuestiones relacionadas