2010-11-20 35 views
6

Tôi muốn có thông báo khi một Khóa đăng ký cụ thể trong HKEY_CURRENT_USER bị thay đổi. Cho đến nay tôi đã cố gắng này qua WMI không thành công:Nhận thông báo khi Giá trị Khóa đã được thay đổi

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

(Lỗi là "Không tìm thấy")

tiếp cận thứ hai của tôi là sử dụng WBEM Scripting COM component với ý định cổng ví dụ từ http://msdn.microsoft.com/en-us/library/aa393042(VS.85).aspx để C# nhưng Tôi không tìm thấy bất kỳ mẫu sử dụng nào cho WBEM COM trong C#

Tôi tìm thấy lớp này là http://www.codeproject.com/KB/system/registrymonitor.aspx, nhưng nó không phù hợp với nhu cầu của tôi vì lớp này chỉ giám sát toàn bộ khóa và tôi chỉ muốn thông báo khi có giá trị cụ thể (được chỉ định qua ValueName trong t anh ta lấy mẫu ở trên) bị thay đổi.

EDIT: Nếu bạn thay đổi Hive thành HKEY_CURRENT_USER trong ví dụ về msdn vbscript, nó sẽ ngừng hoạt động. Tôi không thể tìm thấy bất cứ điều gì về hành vi này nhưng a link from 2003

EDIT2: Thay đổi HKEY_CLASSES_ROOTHKEY_CURRENT_USER phát ban không được hỗ trợ bởi RegistryEvent hoặc các lớp học có nguồn gốc từ nó, chẳng hạn như RegistryValueChangeEvent. (MSDN)

+0

Tôi tin rằng bạn có thể sửa đổi các mã dự án mã để sử dụng nhiều xử lý chờ đợi/màn hình để ít nhất là cho biết chìa khóa đã được thay đổi. Tôi không chắc chắn những gì các tác động của n màn hình là mặc dù - không có vẻ như vậy xấu: http://blogs.technet.com/b/markrussinovich/archive/2009/09/29/3283844.aspx :-) –

Trả lời

11

cuối cùng tôi giải quyết vấn đề và có phiên bản truy vấn WMI để làm việc:

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

Tôi thấy điều này "hack" tại http://www.codeproject.com/Messages/2844468/Monitoring-HKEY_CURRENT_USER.aspx

0

Đã tải lên pastbin một lớp học hay. Hy vọng nó phù hợp với nhu cầu của bạn.

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

+1

Điều này trông giống như lớp RegistryMonitor từ codeproject mà tôi đã đề cập trong câu hỏi của tôi không phù hợp với nhu cầu của tôi bởi vì nó thông báo nếu có bất kỳ giá trị nào trong các thay đổi quan trọng và không chỉ nếu một thay đổi cụ thể ... – RoXX

+0

@RoXX bạn không thể lặp lại thông qua các giá trị đã thay đổi và xem liệu giá trị bạn muốn có phải không? –

+0

Tôi có thể nhưng có rất nhiều giá trị khác thay đổi và sẽ tốt hơn nếu tôi có thể lọc chúng ở mức thấp hơn như với truy vấn wmi, tôi đang tìm một giải pháp đẹp hơn. – RoXX

Các vấn đề liên quan