2010-11-20 17 views
6

मुझे एक अधिसूचना चाहिए जब HKEY_CURRENT_USER में एक विशिष्ट रजिस्ट्रीकी बदल दी गई हो। अब तक मुझे कोई सफलता के साथ WMI के माध्यम से इस की कोशिश की:रजिस्ट्रीकी मान बदल दिया गया था जब अधिसूचना प्राप्त करें

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

(त्रुटि था "नहीं मिला")

मेरी दूसरी दृष्टिकोण था WBEM Scripting COM component बंदरगाह के इरादे के साथ ग # करने के लिए http://msdn.microsoft.com/en-us/library/aa393042(VS.85).aspx से उदाहरण का उपयोग लेकिन मुझे डब्लूबीईएम कॉम के लिए सी #

में यह http://www.codeproject.com/KB/system/registrymonitor.aspx वर्ग मिला, लेकिन यह मेरी आवश्यकताओं के अनुरूप नहीं था क्योंकि यह वर्ग केवल पूरी कुंजी पर नज़र रखता है और मुझे केवल एक विशिष्ट मान होने पर एक अधिसूचना चाहिए (टी में ValueName के माध्यम से निर्दिष्ट वह उपरोक्त नमूने) बदल जाता है।

संपादित करें: यदि आप msdn vbscript उदाहरण में HKEY_CURRENT_USER पर हाइव बदलते हैं, तो यह काम करना बंद कर देता है। मैं इस व्यवहार के बारे में कुछ भी लेकिन नहीं पा सके a link from 2003

EDIT2: HKEY_CLASSES_ROOT और HKEY_CURRENT_USER पित्ती को परिवर्तन ऐसे RegistryValueChangeEvent के रूप में यह से ली गई RegistryEvent या कक्षाएं, द्वारा समर्थित नहीं हैं। (MSDN)

+0

पर "हैक" मुझे विश्वास है कि आप कोड-प्रोजेक्ट को संशोधित कई प्रतीक्षा हैंडल/मॉनीटर का उपयोग करने के लिए कोड कम से कम बताएं कि कौन सी कुंजी बदल दी गई है। मुझे यकीन नहीं है कि एन मॉनीटर के प्रभाव क्या हैं - ऐसा बुरा नहीं लगता है: http://blogs.technet.com/b/markrussinovich/archive/2009/09/29/3283844.aspx :-) –

उत्तर

11

मैं अंत में समस्या हल हो और काम करने के लिए WMI क्वेरी संस्करण है:

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

मैंने पाया इस http://www.codeproject.com/Messages/2844468/Monitoring-HKEY_CURRENT_USER.aspx

0

पेस्टबिन में अपलोड किया गया यह एक अच्छी कक्षा है जो इसे करता है। उम्मीद है कि यह आपकी जरूरतों के अनुरूप है।

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

+1

यह कोडप्रोजेक्ट से रजिस्ट्री मॉनिटर क्लास जैसा दिखता है, जैसा कि मैंने अपने प्रश्न में उल्लेख किया है, मेरी ज़रूरतों को पूरा नहीं करता है क्योंकि यह सूचित करता है कि कुंजी में कोई भी मूल्य बदलता है और न केवल तभी बदलता है जब कोई विशिष्ट परिवर्तन ... – RoXX

+0

@RoXX आप अभी पुनरावृत्त नहीं कर सकते बदल गए मूल्यों के माध्यम से और देखें कि क्या आप चाहते थे? –

+0

मैं कर सकता हूं लेकिन कई अन्य मूल्य हैं जो बदलते हैं और यह अच्छा होगा अगर मैं उन्हें कम स्तर पर फ़िल्टर कर सकता हूं जैसे Wmi क्वेरी के साथ, मैं एक अच्छे समाधान की तलाश में हूं। – RoXX