2012-04-13 14 views
7

Tôi đang sử dụng mã C# sau đây trong Dịch vụ Windows (chạy như NT_AUTHORITY\SYSTEM) để tạo trình xử lý sự kiện để nhận sự kiện tạo quy trình (sử dụng WMI và WQL):Xử lý sự kiện bắt đầu bằng cách sử dụng WMI - Không phải tất cả quy trình bắt đầu được phát hiện

string queryString = "SELECT * FROM Win32_ProcessStartTrace"; 
ManagementEventWatcher watcher = new ManagementEventWatcher(new WqlEventQuery(queryString)); 
watcher.EventArrived += new EventArrivedEventHandler(ProcessStartEvent); 
watcher.Start(); 

Trong ProcessStartEvent:

int processId = int.Parse(e.NewEvent.Properties["ProcessId"].Value.ToString()); 
Process proc = Process.GetProcessById(processId); 

Out("Received process: " + proc.ProcessName); 

vấn đề tôi đang gặp là (vì một lý do lạ) không phải mọi quá trình bắt đầu là c đã yêu cầu và được báo cáo bởi chương trình. Nếu tôi bắt đầu khoảng 6 quá trình cùng một lúc, người ta có thể không hiển thị trong đầu ra.

Tôi đã cố gắng thực hiện một số nghiên cứu về ghi lại các sự kiện tạo quy trình bằng WMI, nhưng có sẵn thông tin giới hạn. Tôi đã nhìn thấy rằng nó cũng có thể nắm bắt được quá trình bắt đầu sử dụng một cái gì đó tương tự như:

SELECT TargetInstance 
FROM __InstanceCreationEvent 
WITHIN 2 
WHERE TargetInstance ISA 'Win32_Process' 

(Như đã thấy trong this Stack Overflow answer)

Có bất kỳ sự khác biệt lớn giữa việc sử dụng __InstanceCreationEventWin32_ProcessStartTrace? Đây có phải là nguyên nhân của vấn đề của tôi không?

Có giải thích lý do tại sao tôi không nhận được sự kiện cho tất cả bắt đầu quá trình? Có điều gì rõ ràng hơn là tôi đang làm sai ở đây không?

+0

Bản sao có thể có của [Sự kiện .NET cho quá trình thực thi quy trình] (http://stackoverflow.com/questions/848618/net-events-for-process-executable-start) –

+0

@Dimi Tôi có thể nói đây là một câu hỏi khác, vì điều này tập trung vào lý do tại sao một số sự kiện dường như biến mất trong khi những sự kiện khác bị bắt ngay cả khi sử dụng phương pháp được cho là "chính xác" để bắt các sự kiện bắt đầu quy trình. – Xenon

Trả lời

6

Cả hai phương pháp đều hợp lệ nhưng hoạt động theo các cách khác nhau.

Khi bạn sử dụng lớp WMI __InstanceCreationEvent bạn đang sử dụng sự kiện intrinsic có nghĩa là bạn đang theo dõi các thay đổi trong mô hình dữ liệu WMI chuẩn (hoạt động như trình kích hoạt trong bảng).

Khi bạn sử dụng Win32_ProcessStartTrace bạn đang sử dụng sự kiện Extrinsic có nghĩa là bạn đang sử dụng lớp sự kiện chuyên biệt được thực hiện cho một tác vụ cụ thể trong trường hợp này theo dõi quá trình tạo.

Bây giờ, quay lại vấn đề của bạn, cách tốt nhất để tránh "bị mất" của một số sự kiện là tạo permanent event consumer.

+0

Có thể tạo một người tiêu dùng sự kiện vĩnh viễn bằng C# /. NET không? – Xenon

+0

tiêu chuẩn đang sử dụng mof, kiểm tra bài viết này [Tạo WMI đăng ký sự kiện vĩnh viễn sử dụng MOF] (http: //www.codeproject.com/Articles/28226/Tạo-WMI-Vĩnh viễn-Sự kiện-Đăng ký-Sử dụng-M) – RRUZ

+0

Vấn đề với việc sử dụng MOF là tôi cần để có thể nhận các sự kiện trong ứng dụng dịch vụ C# của tôi. – Xenon

3

Tôi đã tìm thấy khi bạn nhận được một sự kiện mà một quá trình đã bắt đầu - chuyển sự kiện đó thành một chuỗi riêng biệt với chủ đề tăng thể hiện bạn có thể chuyển ID tiến trình tới một chuỗi mới.

Điều này có nghĩa là COM WMI không bị rối và ngừng hoạt động.

xem http://sourceforge.net/p/processhistory/code/HEAD/tree/trunk/PHLogger/COM_WMI_Consumer/

đối với một số mã C++ đang hoạt động.

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