You can also use WMI Events to track this.
Here is an example:
static void Main(string[] args) { var query = new EventQuery("SELECT * FROM __InstanceCreationEvent WITHIN 1 WHERE TargetInstance isa \"Win32_Process\""); using (var eventWatcher = new ManagementEventWatcher(query)) { eventWatcher.EventArrived += eventWatcher_EventArrived; eventWatcher.Start(); Console.WriteLine("Started"); Console.ReadLine(); eventWatcher.EventArrived -= eventWatcher_EventArrived; eventWatcher.Stop(); } } static void eventWatcher_EventArrived(object sender, EventArrivedEventArgs e) { try { var instanceDescription = e.NewEvent.GetPropertyValue("TargetInstance") as ManagementBaseObject; if(instanceDescription!=null) { var executablePath = instanceDescription.GetPropertyValue("ExecutablePath"); if(executablePath!=null) { Console.WriteLine("Application {0} started", executablePath.ToString()); } } } catch (ManagementException) { } }
There are many process attributes that can be obtained. Like arguments Priority, Description, Command Line, etc. You can look at instanceDescription.Properties for more information.
source share