2012-04-13 9 views
7

Używam następującego kodu C# w usłudze systemu Windows (która działa jako NT_AUTHORITY\SYSTEM), aby utworzyć procedurę obsługi zdarzeń do odbierania zdarzeń tworzenia procesów (przy użyciu usług WMI i WQL):Rozpocznij proces przy użyciu usługi WMI - nie wszystkie procesy są wykrywane

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

W ProcessStartEvent:

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

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

problem mam jest to, że (z jakiegoś dziwnego powodu) nie każdy początek procesu jest c aptured i zgłoszone przez program. Jeśli rozpoczynam około 6 procesów jednocześnie, jeden nie może pojawić się na wyjściu.

Próbowałem wykonać pewne badania dotyczące przechwytywania zdarzeń związanych z tworzeniem procesów za pomocą usługi WMI, ale dostępne są ograniczone informacje. Widziałem, że jest to również możliwe, aby uchwycić proces zaczyna używać coś podobnego do:

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

(Jak widać w this Stack Overflow answer)

Czy istnieją znaczne różnice między użyciem __InstanceCreationEvent i Win32_ProcessStartTrace? Czy to może być przyczyną moich problemów?

Czy istnieje wyjaśnienie, dlaczego nie otrzymuję zdarzeń dla wszystkie rozpoczyna się proces? Czy jest coś bardziej oczywistego, że robię źle tutaj?

+0

Prawdopodobny duplikat [.NET Events dla uruchomienia uruchamianego procesu] (http://stackoverflow.com/questions/848618/net-events-for-process-executable-start) –

+0

@Dimi Powiedziałbym, że to dość inne pytanie, ponieważ koncentruje się na tym, dlaczego niektóre zdarzenia znikają, podczas gdy inne są złapane nawet przy użyciu rzekomo "poprawnej" metody łapania zdarzeń rozpoczęcia procesu. – Xenon

Odpowiedz

6

Obie metody są ważne, ale działają w różny sposób.

Gdy używasz klasy WMI __InstanceCreationEvent, używasz zdarzenia intrinsic, co oznacza, że ​​monitorujesz zmiany w standardowym modelu danych WMI (działa to jak wyzwalacz w tabeli).

Podczas korzystania z Win32_ProcessStartTrace używasz zdarzenia Extrinsic, co oznacza, że ​​używasz specjalistycznej klasy zdarzeń wykonanej dla określonego zadania, w tym przypadku monitoruj proces tworzenia.

Wracając do Twojego problemu, najlepszym sposobem na uniknięcie "utraty" niektórych wydarzeń jest utworzenie permanent event consumer.

+0

Czy można utworzyć stałego konsumenta zdarzeń za pomocą C#/.NET? – Xenon

+0

standard używa mof, zobacz ten artykuł [Tworzenie stałych subskrypcji WMI za pomocą MOF] (http: //www.codeproject.com/Articles/28226/Tworzenie-WMI-Permanent-Event-Subscriptions-Using-M) – RRUZ

+0

Problem z używaniem MOF polega na tym, że muszę mieć możliwość odbierania zdarzeń w mojej aplikacji usługi C#. – Xenon

Powiązane problemy