2010-11-20 9 views
6

Chcę otrzymać powiadomienie, gdy określony klucz rejestru w zmiennej HKEY_CURRENT_USER został zmieniony. Do tej pory próbowałem to poprzez WMI bez powodzenia:Otrzymuj powiadomienie, gdy wartość klucza rejestru została zmieniona

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 „nie znaleziono”)

Drugie podejście było za pomocą WBEM Scripting COM component z zamiarem portu przykład z http://msdn.microsoft.com/en-us/library/aa393042(VS.85).aspx do C#, ale Nie znalazłem próbek użycia dla WBEM COM w C#

Znalazłem tę klasę http://www.codeproject.com/KB/system/registrymonitor.aspx, ale nie pasowało to do moich potrzeb, ponieważ ta klasa monitoruje tylko cały klucz i chcę tylko powiadomienie, gdy określona wartość (określone przez ValueName wt próbki powyżej) zostaje zmieniony.

EDYCJA: Po zmianie ula na HKEY_CURRENT_USER w przykładzie msdn vbscript, przestaje działać. Nie mogłem znaleźć nic na temat tego zachowania, ale a link from 2003

EDIT2: Zmiany HKEY_CLASSES_ROOT i HKEY_CURRENT_USER uli nie są obsługiwane przez RegistryEvent lub klas pochodnych od niego, takich jak RegistryValueChangeEvent. (MSDN)

+0

Wierzę, że można zmodyfikować kod-project kod do używania wielu uchwytów oczekiwania/monitorów dla wszystkich, którzy najmniej mówią, który klucz został zmieniony. Nie jestem pewien, jakie są implikacje n monitorów - nie wygląda to tak źle: http://blogs.technet.com/b/markrussinovich/archive/2009/09/29/3283844.aspx :-) –

Odpowiedz

11

I wreszcie rozwiązał problem i mam wersję kwerendy WMI do pracy:

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

znalazłem to "hack" w http://www.codeproject.com/Messages/2844468/Monitoring-HKEY_CURRENT_USER.aspx

0

Przesłano do pastina miłej klasy, która to robi. Mam nadzieję, że pasuje do twoich potrzeb.

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

+1

Wygląda to na klasę RegistryMonitor z codeproject, która, jak wspomniałem w moim pytaniu, nie pasuje do moich potrzeb, ponieważ informuje, czy jakakolwiek wartość w kluczu się zmienia, a nie tylko, gdy konkretna zmienia ... – RoXX

+0

@RoXX nie możesz po prostu powtórzyć przez wartości, które się zmieniły i zobaczysz, czy zrobiłeś to, co chciałeś? –

+0

Mogę, ale jest wiele innych wartości, które się zmieniają i byłoby miło, gdybym mógł je odfiltrować na niższym poziomie, jak w zapytaniu WMI, szukam lepszego rozwiązania. – RoXX