2009-02-04 24 views
9

Estamos tratando de desarrollar una pequeña aplicación que pueda monitorear los programas/procesos que se están ejecutando en una máquina con Windows.¿Cómo supervisar la ejecución del proceso/programa en Windows?

Si no se supone que el programa/proceso a ejecutar, que deben ser bloqueados. Funciona de manera similar a un antivirus.

Esta es la idea básica.

Quiero saber las formas de conectar en el sistema operativo para ser notificado acerca de cada programa/proceso de intentar ejecutar en la máquina.

Respuesta

9

La forma más sencilla es utilizar WMI. Monitorear específicamente el Win32_ProcessStartTrace. Esto es mejor que Win32_Process, porque está configurado para usar eventos, mientras que Win32_Process requiere sondeo, que requiere más CPU. A continuación se muestra cómo hacerlo en C#. Primero asegúrese de que System.Management esté configurado como referencia para su proyecto.

public System.Management.ManagementEventWatcher mgmtWtch; 

    public Form1() 
    { 
     InitializeComponent(); 
     mgmtWtch = new System.Management.ManagementEventWatcher("Select * From Win32_ProcessStartTrace"); 
     mgmtWtch.EventArrived += new System.Management.EventArrivedEventHandler(mgmtWtch_EventArrived); 
     mgmtWtch.Start(); 
    } 

    void mgmtWtch_EventArrived(object sender, System.Management.EventArrivedEventArgs e) 
    { 
     MessageBox.Show((string)e.NewEvent["ProcessName"]); 
    } 

    private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     mgmtWtch.Stop(); 
    } 

El código generará un cuadro de mensaje cada vez que inicie un nuevo proceso. Desde allí, puede consultar una lista blanca/lista negra y actuar de forma adecuada.

+1

Desafortunadamente, parece que WMI entrega notificaciones hasta 5 segundos después de que se haya creado el proceso. No es útil para notificaciones en tiempo real ni para hacer cosas con tareas breves. –

+1

he encontrado un ejemplo en el sitio web de Microsoft para la misma tarea [aquí] (http://msdn.microsoft.com/en-us/library/system.management.managementeventwatcher.waitfornextevent.aspx?cs-save-lang=1&cs- lang = csharp # code-snippet-1), pero tiene el mismo problema. –

+0

Gah ... el uso de WMI consume más CPU que el sondeo manual de la lista de procesos (simplemente ocurre en el proceso de servicio de WMI en lugar de en el proceso). Además, si su aplicación falla, la suscripción seguirá ejecutándose en el servicio WMI, chupando CPU ... –

0

me trataron havn't que consigue notificación en tiempo real. Cómo siempre, aquí es cómo conseguir procesos en C# corriendo

using System.Diagnostics; 

//Somewhere in your method 

Process[] runningList = Process.GetProcesses(); 

foreach(Process p in runningList){ 
Console.WriteLine("Process: {0} ID: {1}", p.ProcessName, p.Id); 
} 

También puede utilizar los siguientes pilares de un proceso

  • Hora de inicio - Muestra la hora de iniciar el proceso
  • TotalProcessorTime - Muestra el cantidad de tiempo de CPU que el proceso ha tomado
  • temas - da acceso a la colección de hilos en el proceso
0

Me gustaría comprobar el Win32 API-SetWindowsHookEx con el WH_GETMESSAGE constante añadir una devolución de llamada a su programa cuando se crea una nueva ventana.

http://pinvoke.net/default.aspx/user32.SetWindowsHookEx

Google API y que WH_GETMESSAGE para averiguar más.

También puedes ver los artículos siguientes librerias/Código: http://www.vbaccelerator.com/home/Vb/Code/Libraries/Hooks/vbAccelerator_Hook_Library/article.asp

http://www.codeproject.com/KB/DLL/hooks.aspx?fid=2061&df=90&mpp=25&noise=3&sort=Position&view=Quick&fr=76&select=726975

Cuestiones relacionadas