2009-12-31 14 views
30

C'è un modo per determinare quando è stata eseguita l'ultima volta che un determinato computer ha eseguito un processo?.NET Process Monitor

È possibile utilizzare quanto segue per determinare se un processo è in esecuzione, ma l'applicazione non può eseguire il processo se è stato interrotto.

Process[] process = Process.GetProcessesByName(processName, serverName); 

risposta

57

WMI fornisce un modo per tenere traccia dei processi che iniziano e terminano con le classi Win32_ProcessTrace. Meglio mostrato con un esempio. Avviare una nuova applicazione Console, Progetto + Aggiungi riferimento, selezionare System.Management. Incolla questo codice:

using System; 
using System.Management; 

class Process { 
    public static void Main() { 
    ManagementEventWatcher startWatch = new ManagementEventWatcher(
     new WqlEventQuery("SELECT * FROM Win32_ProcessStartTrace")); 
    startWatch.EventArrived += new EventArrivedEventHandler(startWatch_EventArrived); 
    startWatch.Start(); 
    ManagementEventWatcher stopWatch = new ManagementEventWatcher(
     new WqlEventQuery("SELECT * FROM Win32_ProcessStopTrace")); 
    stopWatch.EventArrived += new EventArrivedEventHandler(stopWatch_EventArrived); 
    stopWatch.Start(); 
    Console.WriteLine("Press any key to exit"); 
    while (!Console.KeyAvailable) System.Threading.Thread.Sleep(50); 
    startWatch.Stop(); 
    stopWatch.Stop(); 
    } 

    static void stopWatch_EventArrived(object sender, EventArrivedEventArgs e) { 
    Console.WriteLine("Process stopped: {0}", e.NewEvent.Properties["ProcessName"].Value); 
    } 

    static void startWatch_EventArrived(object sender, EventArrivedEventArgs e) { 
    Console.WriteLine("Process started: {0}", e.NewEvent.Properties["ProcessName"].Value); 
    } 
} 

Edit the manifest quindi questo programma viene eseguito elevata. Quindi avvia semplicemente alcuni programmi per vederlo al lavoro. Fai attenzione che non è particolarmente veloce.

+1

Grazie. Ho appena provato e funziona perfettamente. –

+1

Funziona perfettamente, ma il ritardo è fastidioso, c'è comunque lo scopo di farlo più velocemente? –

+0

L'ho appena provato e ho un ritardo di meno di 1 secondo. Penso che questo sia ok. – webber2k6

5

Non sarà in grado di farlo utilizzando la classe Process. Tuttavia, dovrebbe essere possibile capire quando l'ultima applicazione è stata eseguita configurando il tracciamento del processo di controllo in Windows. I seguenti link potrebbero iniziare:

Audit process tracking

How can I track what programs come and go on my machine?

L'inseguimento processo creerà voci nel registro eventi di Windows che è quindi possibile accedere utilizzando C#.