Inizio .NET Events for Process eseguibile

C’è un modo per registrarsi per un evento che si triggers quando viene avviato un eseguibile di un particolare nome file? So che è abbastanza facile ottenere un evento quando un processo termina, ottenendo la gestione del processo e la registrazione per l’evento uscito. Ma come si può essere avvisati quando un processo, che non è già in esecuzione, inizia … senza eseguire il polling di tutti i processi in esecuzione?

Potresti usare quanto segue:

private ManagementEventWatcher WatchForProcessStart(string processName) { string queryString = "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 string scope = @"\\.\root\CIMV2"; // Create a watcher and listen for events ManagementEventWatcher watcher = new ManagementEventWatcher(scope, queryString); watcher.EventArrived += ProcessStarted; watcher.Start(); return watcher; } private ManagementEventWatcher WatchForProcessEnd(string processName) { string queryString = "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 string scope = @"\\.\root\CIMV2"; // Create a watcher and listen for events ManagementEventWatcher watcher = new ManagementEventWatcher(scope, queryString); watcher.EventArrived += ProcessEnded; watcher.Start(); return watcher; } private void ProcessEnded(object sender, EventArrivedEventArgs e) { ManagementBaseObject targetInstance = (ManagementBaseObject) e.NewEvent.Properties["TargetInstance"].Value; string processName = targetInstance.Properties["Name"].Value.ToString(); Console.WriteLine(String.Format("{0} process ended", processName)); } private void ProcessStarted(object sender, EventArrivedEventArgs e) { ManagementBaseObject targetInstance = (ManagementBaseObject)e.NewEvent.Properties["TargetInstance"].Value; string processName = targetInstance.Properties["Name"].Value.ToString(); Console.WriteLine(String.Format("{0} process started", processName)); } 

Chiamerai quindi WatchForProcessStart e / o WatchForProcessEnd passando il nome del processo (ad esempio “notepad.exe”).

L’object ManagementEventWatcher viene restituito dai due metodi Watch * mentre implementa IDisposable e pertanto è necessario chiamare Dispose su questi oggetti al termine dell’operazione per evitare problemi.

È anche ansible modificare il valore del polling nelle query se è necessario che l’evento venga generato più rapidamente dopo l’avvio del processo. Per fare questo cambia la riga “ENTRO 10” per ENTRARE in qualcosa di meno di 10.

WMI può creare eventi quando vengono creati processi. Potresti quindi filtrare questi eventi.

Ecco il codice.

Si noti che è necessario avviare Visual Studio come amministratore per poter eseguire questo codice.

 using System; using System.Management; namespace AppLaunchDetector { class Program { static void Main(string[] 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); } } } }