2009-12-31 16 views
30

¿Hay alguna forma de determinar cuándo fue la última vez que un equipo específico ejecutó por última vez un proceso?.NET Process Monitor

puedo usar lo siguiente para determinar si un proceso se está ejecutando, pero la aplicación no puede agarrar el proceso si se ha parado desde entonces.

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

Respuesta

57

WMI proporciona una manera de realizar un seguimiento de los procesos de arranque y que terminan con las clases Win32_ProcessTrace. Se muestra mejor con un ejemplo. Inicie una nueva aplicación de consola, Proyecto + Agregar referencia, seleccione Administración del sistema. Pega este código:

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 por lo que este programa se ejecuta elevada. Luego, simplemente inicie algunos programas para ver cómo funciona. Ten en cuenta que no es especialmente rápido.

+1

Gracias. Lo intenté y funciona perfectamente. –

+1

Funciona perfectamente, pero el retraso es molesto, ¿hay alguna forma de hacerlo más rápido? –

+0

Acabo de probarlo y tengo un retraso de menos de 1 segundo. Creo que esto está bien. – webber2k6

5

Usted no será capaz de hacer esto utilizando la clase Process. Sin embargo, debería ser posible determinar cuándo se ejecutó por última vez una aplicación configurando el seguimiento del proceso de auditoría en Windows. Los siguientes enlaces pueden empezar:

Audit process tracking

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

El seguimiento de procesos creará entradas en el registro de eventos de Windows que luego se puede acceder utilizando C#.