2010-11-20 13 views
6

HKEY_CURRENT_USER'daki belirli bir Kayıt Defteri Anahtarı değiştirildiğinde bir bildirim istiyorum. Şimdiye kadar hiçbir başarı ile WMI yoluyla bu çalıştı:RegistryKey Değeri değiştirildiği zaman bildirim alın

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

(Hata "Bulunamadı" oldu)

Benim ikinci yaklaşımdı C# için http://msdn.microsoft.com/en-us/library/aa393042(VS.85).aspx limana niyetiyle örnek WBEM Scripting COM component kullanılarak fakat Ben WBEM COM için kullanım örnekleri bulamadık C#

Bu http://www.codeproject.com/KB/system/registrymonitor.aspx sınıfını buldum, ancak bu sınıf yalnızca tüm anahtarı izlediğinden ve yalnızca belirli bir değer olduğunda bildirim almak istediğim için ihtiyaçlarıma uymuyor (ValueName aracılığıyla t Yukarıdaki örnekler) değişti.

DÜZENLEME: Kovanı msdn vbscript örneğinde HKEY_CURRENT_USER olarak değiştirirseniz, çalışmayı durdurur. Bu davranış hakkında bir şey ama bulamadık a link from 2003

EDIT2: HKEY_CLASSES_ROOT ve HKEY_CURRENT_USER kovanlara Değişiklikler böyle RegistryValueChangeEvent olarak ondan türetilen RegistryEvent veya sınıflar tarafından desteklenmemektedir. (MSDN)

+0

kısmındaki "kesmek" bulundu Birden çok bekletme tutamaçlarını/monitörünü kullanmak için kod, en azından hangi anahtarın değiştirildiğini söyler. N monitörlerin etkilerinin ne olduğundan emin değilim - bu kadar kötü görünmüyor: http://blogs.technet.com/b/markrussinovich/archive/2009/09/29/3283844.aspx :-) –

cevap

11

Sonunda sorun çözüldü ve işe WMI sorgusu versiyonu var:

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

Sana kod projeyi değiştirmek inanıyoruz bu http://www.codeproject.com/Messages/2844468/Monitoring-HKEY_CURRENT_USER.aspx

0

Pastaneye yüklenen hoş bir sınıf. Umarım ihtiyaçlarınızı karşılar.

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

+1

Bu benim soruya değindiğim gibi anahtar programındaki herhangi bir değerin değişip değişmediğini ve sadece belirli bir değişkenin değişip değişmediğini bildiren kod programından gelen RegistryMonitor sınıfına benziyor. – RoXX

+0

@RoXX Değişen ve istediğin şeyin yapılıp yapılmadığını görmek için? –

+0

Yapabilirim ama değişebilen bir çok değer var ve onları wmi sorgusuyla daha düşük bir seviyede filtreleyebilirsem hoş olurdu, daha güzel bir çözüm arıyorum. – RoXX

İlgili konular