2012-04-13 64 views
7

我在Windows服務(運行時爲NT_AUTHORITY\SYSTEM)中使用以下C#代碼來創建用於接收進程創建事件(使用WMI和WQL)的事件處理程序:使用WMI進程啓動事件 - 並非檢測到所有進程開始

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

ProcessStartEvent

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

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

我遇到的問題是,(一些奇怪的原因)不是每一個過程的開始爲c截獲並由程序報告。如果我同時啓動大約6個進程,則可能不會顯示在輸出中。

我試圖做一些關於使用WMI捕獲進程創建事件的研究,但是有限的信息可用。我已經看到的是,還可以拍攝過程中開始使用類似的東西:

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

(如this Stack Overflow answer所示)

是否有使用__InstanceCreationEventWin32_ProcessStartTrace之間的主要區別?這可能是我的問題的原因嗎?

是否有所有過程開始解釋,爲什麼我沒有收到事件?有什麼更明顯的,我在這裏做錯了嗎?

+0

可能重複的[.NET事件進程可執行文件啓動](http://stackoverflow.com/questions/848618/net-events-for-process-executable-start) – 2016-06-06 17:26:43

+0

@Dimi我會說這是一個相當不同的問題,因爲這着重於爲什麼有些事件似乎消失了,而有些事件甚至在使用所謂的「正確」方法捕捉流程啓動事件時被捕獲。 – Xenon 2016-06-16 01:27:42

回答

6

這兩種方法都是有效的,但以不同的方式起作用。

當您使用__InstanceCreationEvent WMI類時,您正在使用intrinsic事件,這意味着您正在監視標準WMI數據模型中的更改(這適用於表中的觸發器)。

當您使用Win32_ProcessStartTrace時,您正在使用Extrinsic事件,這意味着您正在使用針對特定任務制定的專用事件類,以監視流程創建。

現在回到您的問題,避免某些事件「丟失」的最佳方法是創建permanent event consumer

+0

是否可以使用C#/ .NET創建永久事件消費者? – Xenon 2012-04-13 20:18:55

+0

該標準使用mof,請查看本文[使用MOF創建WMI永久事件訂閱](http://www.codeproject。com/Articles/28226/Creating-WMI-Permanent-Event-Subscriptions-Using-M) – RRUZ 2012-04-13 20:23:04

+0

使用MOF的問題是我需要能夠在我的C#服務應用程序中接收事件。 – Xenon 2012-04-13 20:32:50