2010-11-20 13 views
6

Desidero ricevere una notifica quando viene modificato uno specifico Registro di sistema in HKEY_CURRENT_USER. Finora ho provato questo via WMI senza successo:Ricevi notifica quando è stato modificato il valore di Registro di sistema

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

(errore è stato "Non trovato")

mio secondo approccio è stato utilizzando il WBEM Scripting COM component con l'intento di porto l'esempio da http://msdn.microsoft.com/en-us/library/aa393042(VS.85).aspx a C#, ma Non ho trovato esempi di utilizzo per WBEM COM in C#

Ho trovato questa classe http://www.codeproject.com/KB/system/registrymonitor.aspx, ma non si adattava alle mie esigenze in quanto questa classe monitora solo l'intera chiave e desidero solo una notifica quando un valore specifico (specificato tramite ValueName in t lui campioni sopra) viene cambiato.

MODIFICA: Se si modifica l'Hive su HKEY_CURRENT_USER nell'esempio di vdscript msdn, smette di funzionare. Non ho trovato nulla su questo comportamento, ma a link from 2003

EDIT2: Modifiche ai HKEY_CLASSES_ROOT e HKEY_CURRENT_USER alveari non sono supportati da RegistryEvent o classi derivate da esso, come ad esempio RegistryValueChangeEvent. (MSDN)

+0

io credo che si possa modificare il codice progetto codice per utilizzare più handle di attesa/monitor per indicare almeno quale chiave è stata cambiata. Non sono sicuro di quali siano le implicazioni di n monitor - non sembra così male: http://blogs.technet.com/b/markrussinovich/archive/2009/09/29/3283844.aspx :-) –

risposta

11

ho finalmente risolto il problema ed ho ottenuto la versione query WMI a lavorare:

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

ho trovato questo "hack" in http://www.codeproject.com/Messages/2844468/Monitoring-HKEY_CURRENT_USER.aspx

0

Caricato per scambiare una bella classe che lo fa. Spero che soddisfi le tue esigenze.

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

+1

Questo è simile alla classe RegistryMonitor di codeproject che, come accennato nella mia domanda, non soddisfa le mie esigenze perché notifica se qualsiasi valore nella chiave cambia e non solo se uno specifico cambia ... – RoXX

+0

@RoXX non puoi semplicemente iterare attraverso i valori che sono cambiati e vedere se quello che volevi ha fatto? –

+0

Potrei, ma ci sono molti altri valori che cambiano e sarebbe bello se potessi filtrarli a un livello inferiore come con la query wmi, sto cercando una soluzione migliore. – RoXX

Problemi correlati