2010-11-20 9 views
6

Я хочу получить уведомление, когда изменяется конкретный RegistryKey в HKEY_CURRENT_USER. До сих пор я попытался это с помощью WMI без успеха:Получить уведомление, когда 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(); 

(ошибка была «не найден»)

Мой второй подход с использованием WBEM Scripting COM component с целью в порт пример из http://msdn.microsoft.com/en-us/library/aa393042(VS.85).aspx на C#, но Я не нашел примеров использования для WBEM COM в C#

Я нашел этот класс http://www.codeproject.com/KB/system/registrymonitor.aspx, но это не соответствовало моим потребностям, так как этот класс контролирует весь ключ, и мне нужно только уведомление, когда определенное значение (определяется через ValueName в sa сверху).

EDIT: Если вы изменили Улей на HKEY_CURRENT_USER в примере msdn vbscript, он перестает работать. Я не мог найти ничего об этом поведении, но a link from 2003

EDIT2: Изменения в HKEY_CLASSES_ROOT и HKEY_CURRENT_USER ульев не поддерживаются RegistryEvent или классов, производных от него, например, RegistryValueChangeEvent. (MSDN)

+0

Я считаю, что вы можете изменить код-проект код, чтобы использовать несколько дескрипторов/мониторов для всех, чтобы определить, какой ключ был изменен. Я не уверен, что последствия для n мониторов - это не так уж плохо: http://blogs.technet.com/b/markrussinovich/archive/2009/09/29/3283844.aspx :-) – 2010-11-20 19:11:00

ответ

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

Загружено в pastbin класс, который это делает. Надеюсь, это соответствует вашим потребностям.

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

+1

Это похоже на класс RegistryMonitor из codeproject, который, как я упоминал в моем вопросе, не соответствует моим потребностям, потому что он уведомляет, изменяется ли какое-либо значение в ключе, и не только если изменяется конкретный ... – RoXX

+0

@RoXX вы не можете просто повторить через измененные значения и посмотреть, был ли тот, который вы хотели? –

+0

Я мог бы, но есть много других значений, которые меняются, и было бы неплохо, если бы я мог отфильтровать их на более низком уровне, как в случае с запросом wmi, я ищу более приятное решение. – RoXX

Смежные вопросы