2010-11-20 19 views
6

Quiero una notificación cuando se cambia una clave de registro específica en HKEY_CURRENT_USER. Hasta ahora he intentado esto a través de WMI sin éxito:Recibir notificación cuando se cambió el valor de RegistryKey

var query = new WqlEventQuery(string.Format(
"SELECT * FROM RegistryKeyChangeEvent WHERE Hive='{0}' AND KeyPath='{1}' AND ValueName='{2}'", 
       hive, keyPath.Replace("\\","\\\\"), valueName)); 
_watcher = new ManagementEventWatcher(query); 
_watcher.Scope.Path.NamespacePath = @"root\default"; 
_watcher.EventArrived += (sender, args) => KeyValueChanged(); 
_watcher.Start(); 

(error fue "no encontrado")

Mi segundo enfoque era utilizar el WBEM Scripting COM component con la intención de puerto el ejemplo de http://msdn.microsoft.com/en-us/library/aa393042(VS.85).aspx a C#, pero No encontré ninguna muestra de uso para WBEM COM en C#

Encontré esta clase http://www.codeproject.com/KB/system/registrymonitor.aspx, pero no se ajustaba a mis necesidades ya que esta clase solo monitorea la clave completa y solo quiero una notificación cuando un valor específico (especificado a través del ValueName en t las muestras anteriores) se cambian.

EDITAR: Si cambia el Hive a HKEY_CURRENT_USER en el ejemplo msnn vbscript, deja de funcionar. No pude encontrar nada acerca de este comportamiento, pero a link from 2003

Edit2: Los cambios en los HKEY_CLASSES_ROOTHKEY_CURRENT_USER y colmenas no son compatibles con RegistryEvent o clases derivadas de ella, como RegistryValueChangeEvent. (MSDN)

+0

Creo que se puede modificar el código del proyecto código para usar múltiples controladores/monitores de espera para que todos digan qué tecla ha sido cambiada. No estoy seguro de cuáles son las implicaciones de n monitores, no parece tan malo: http://blogs.technet.com/b/markrussinovich/archive/2009/09/29/3283844.aspx :-) –

Respuesta

11

finalmente resuelto el problema y tengo la versión consulta WMI para trabajar:

var currentUser = WindowsIdentity.GetCurrent(); 
var query = new WqlEventQuery(string.Format(
"SELECT * FROM RegistryValueChangeEvent WHERE Hive='HKEY_USERS' AND KeyPath='{0}\\\\{1}' AND ValueName='{2}'", 
currentUser.User.Value, keyPath.Replace("\\","\\\\"), valueName)); 
_watcher = new ManagementEventWatcher(query); 
_watcher.EventArrived += (sender, args) => KeyValueChanged(); 
_watcher.Start(); 

yo encontramos este "hack" en http://www.codeproject.com/Messages/2844468/Monitoring-HKEY_CURRENT_USER.aspx

0

Subido a pastbin una buena clase que lo hace. Espero que se ajuste a tus necesidades.

http://www.csharp.pastebin.com/0reFh6v2

+1

Esto se parece a la clase RegistryMonitor de codeproject que, como mencioné en mi pregunta, no se ajusta a mis necesidades porque notifica si cambia algún valor en la clave y no solo si cambia uno específico ... – RoXX

+0

@RoXX no puede simplemente iterar a través de los valores que cambiaron y ver si el que quería hizo? –

+0

Podría, pero hay muchos otros valores que cambian y sería bueno si pudiera filtrarlos en un nivel inferior, como con la consulta de wmi, estoy buscando una solución más agradable. – RoXX

Cuestiones relacionadas