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.
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. –
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. –
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 ... –