2012-04-13 14 views
7

Sto utilizzando il seguente codice C# in un servizio di Windows (che viene eseguito come NT_AUTHORITY\SYSTEM) per creare un gestore eventi per la ricezione di eventi di creazione processo (utilizzando WMI e WQL):Evento di avvio processo tramite WMI - Non tutto il processo inizia in corso di rilevamento

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

In ProcessStartEvent:

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

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

Il problema che sto avendo è che (per qualche strana ragione) non ogni avvio del processo è c apaged e segnalato dal programma. Se avvii circa 6 processi contemporaneamente, uno potrebbe non apparire nell'output.

Ho provato a fare qualche ricerca sull'acquisizione di eventi di creazione del processo utilizzando WMI, ma sono disponibili informazioni limitate. Ho visto che è anche possibile catturare processo inizia con qualcosa di simile a:

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

(Come si vede nella this Stack Overflow answer)

Ci sono grandi differenze tra l'utilizzo __InstanceCreationEvent e Win32_ProcessStartTrace? Potrebbe essere questa la causa dei miei problemi?

C'è una spiegazione agli eventi perché io non sono in trattamento per inizia tutto processo? C'è qualcosa di più ovvio che sto sbagliando qui?

+0

Possibile duplicato di [Eventi .NET per avvio eseguibile del processo] (http://stackoverflow.com/questions/848618/net-events-for-process-executable-start) –

+0

@Dimi direi che è piuttosto un domanda diversa, poiché questo si concentra sul motivo per cui alcuni eventi apparentemente svaniscono mentre altri vengono catturati anche quando usano il presunto metodo "corretto" per catturare gli eventi di avvio del processo. – Xenon

risposta

6

Entrambi i metodi sono validi ma funzionano in modi diversi.

Quando si utilizza la classe WMI __InstanceCreationEvent si utilizza un evento intrinsic il che significa che si sta monitorando i cambiamenti nel modello di dati standard WMI (questo funziona come un trigger in una tabella).

Quando si utilizza il Win32_ProcessStartTrace si sta utilizzando un evento Extrinsic che significa che si sta utilizzando una classe di eventi specializzata creata per un'attività specifica in questo caso monitorare la creazione del processo.

Ora tornando al problema, il modo migliore per evitare la "perdita" di alcuni eventi è la creazione di permanent event consumer.

+0

E 'possibile creare un consumatore di eventi permanenti usando C# /. NET? – Xenon

+0

lo standard sta usando mof, controlla questo articolo [Creazione di abbonamenti agli eventi permanenti WMI usando MOF] (http: //www.codeproject.it/Articoli/28226/Creating-WMI-Permanent-Event-Subscriptions-Using-M) – RRUZ

+0

Il problema con l'utilizzo di MOF è che devo essere in grado di ricevere gli eventi nella mia app di servizio C#. – Xenon