10 Stimmen

Benachrichtigung erhalten, wenn der RegistryKey-Wert geändert wurde

Ich möchte eine Benachrichtigung, wenn ein bestimmter RegistryKey in HKEY_CURRENT_USER geändert wird. Bislang habe ich dies versucht über WMI ohne Erfolg:

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

(Fehler war "Nicht gefunden")

Mein zweiter Ansatz war die Verwendung der WBEM Scripting COM component mit der Absicht, das Beispiel von http://msdn.microsoft.com/en-us/library/aa393042(VS.85).aspx zu c#, aber ich habe keine Anwendungsbeispiele für das WBEM COM in c# gefunden

こんなの見つけた http://www.codeproject.com/KB/system/registrymonitor.aspx Klasse, aber sie entsprach nicht meinen Bedürfnissen, da diese Klasse nur den gesamten Schlüssel überwacht und ich nur eine Benachrichtigung möchte, wenn ein bestimmter Wert (angegeben über die ValueName in den obigen Beispielen) wird geändert.

EDIT: Wenn Sie den Hive ändern in HKEY_CURRENT_USER in dem msdn vbscript-Beispiel funktioniert es nicht mehr. Ich konnte nichts über dieses Verhalten finden, aber ein Link aus dem Jahr 2003

EDIT2: Änderungen der HKEY_CLASSES_ROOT y HKEY_CURRENT_USER Hives werden nicht unterstützt von RegistryEvent oder von ihr abgeleitete Klassen, wie RegistryValueChangeEvent . ( MSDN )

19voto

RoXX Punkte 1634

Ich habe das Problem schließlich gelöst und die WMI-Abfrageversion zum Laufen gebracht:

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

Ich habe diesen "Hack" gefunden bei http://www.codeproject.com/Messages/2844468/Monitoring-HKEY_CURRENT_USER.aspx

0voto

byte_slave Punkte 1358

Ich habe in pastbin eine nette Klasse hochgeladen, die das macht. Hoffe, es passt Ihre Bedürfnisse.

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X