Événements .NET pour le démarrage de l’exécutable de processus

Existe-t-il un moyen de s’inscrire pour un événement qui se déclenche lorsqu’un exécutable d’un nom de fichier particulier démarre? Je sais qu’il est assez facile d’obtenir un événement lorsqu’un processus se termine, en prenant en charge le processus et en s’inscrivant pour cet événement. Mais comment pouvez-vous être averti lorsqu’un processus qui n’est pas déjà en cours démarre … sans interroger tous les processus en cours?

Vous pouvez utiliser les éléments suivants:

private ManagementEventWatcher WatchForProcessStart(ssortingng processName) { ssortingng querySsortingng = "SELECT TargetInstance" + " FROM __InstanceCreationEvent " + "WITHIN 10 " + " WHERE TargetInstance ISA 'Win32_Process' " + " AND TargetInstance.Name = '" + processName + "'"; // The dot in the scope means use the current machine ssortingng scope = @"\\.\root\CIMV2"; // Create a watcher and listen for events ManagementEventWatcher watcher = new ManagementEventWatcher(scope, querySsortingng); watcher.EventArrived += ProcessStarted; watcher.Start(); return watcher; } private ManagementEventWatcher WatchForProcessEnd(ssortingng processName) { ssortingng querySsortingng = "SELECT TargetInstance" + " FROM __InstanceDeletionEvent " + "WITHIN 10 " + " WHERE TargetInstance ISA 'Win32_Process' " + " AND TargetInstance.Name = '" + processName + "'"; // The dot in the scope means use the current machine ssortingng scope = @"\\.\root\CIMV2"; // Create a watcher and listen for events ManagementEventWatcher watcher = new ManagementEventWatcher(scope, querySsortingng); watcher.EventArrived += ProcessEnded; watcher.Start(); return watcher; } private void ProcessEnded(object sender, EventArrivedEventArgs e) { ManagementBaseObject targetInstance = (ManagementBaseObject) e.NewEvent.Properties["TargetInstance"].Value; ssortingng processName = targetInstance.Properties["Name"].Value.ToSsortingng(); Console.WriteLine(Ssortingng.Format("{0} process ended", processName)); } private void ProcessStarted(object sender, EventArrivedEventArgs e) { ManagementBaseObject targetInstance = (ManagementBaseObject)e.NewEvent.Properties["TargetInstance"].Value; ssortingng processName = targetInstance.Properties["Name"].Value.ToSsortingng(); Console.WriteLine(Ssortingng.Format("{0} process started", processName)); } 

Vous appelez ensuite WatchForProcessStart et / ou WatchForProcessEnd en transmettant le nom de votre processus (par exemple, “notepad.exe”).

L’object ManagementEventWatcher est renvoyé par les deux méthodes Watch * lorsqu’il implémente IDisposable. Vous devez donc appeler Dispose sur ces objects lorsque vous en avez terminé avec eux pour éviter les problèmes.

Vous pouvez également modifier la valeur d’interrogation dans les requêtes si vous souhaitez que l’événement soit déclenché plus rapidement après le démarrage du processus. Pour ce faire, modifiez la ligne “WITHIN 10” en “WITHIN” (inférieur à 10).

WMI peut créer des événements lorsque des processus sont créés. Vous pouvez ensuite filtrer ces événements.

Voici le code.

Notez que vous devez démarrer Visual Studio en tant qu’administrateur pour exécuter ce code.

 using System; using System.Management; namespace AppLaunchDetector { class Program { static void Main(ssortingng[] args) { ManagementEventWatcher w = null; WqlEventQuery q; try { q = new WqlEventQuery(); q.EventClassName = "Win32_ProcessStartTrace"; w = new ManagementEventWatcher(q); w.EventArrived += new EventArrivedEventHandler(ProcessStartEventArrived); w.Start(); Console.ReadLine(); // block main thread for test purposes } catch (Exception ex) { } finally { w.Stop(); } } static void ProcessStartEventArrived(object sender, EventArrivedEventArgs e) { foreach (PropertyData pd in e.NewEvent.Properties) { Console.WriteLine("\n============================= ========="); Console.WriteLine("{0},{1},{2}", pd.Name, pd.Type, pd.Value); } } } }