Есть ли способ зарегистрировать событие, которое запускается при запуске исполняемого файла определенного имени файла? Я знаю, что достаточно легко получить событие, когда процесс завершается, получая дескриптор процесса и регистрируясь для выходящего события. Но как вы можете получать уведомления, когда процесс, который еще не запущен, запускается... без опроса всех запущенных процессов?
События .NET для запуска исполняемого файла процесса
Ответ 1
Вы можете использовать следующее:
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));
}
Затем вы вызывали либо WatchForProcessStart, и/или WatchForProcessEnd, передавая имя вашего процесса (например, "notepad.exe" ).
Объект ManagementEventWatcher возвращается из двух методов Watch *, поскольку он реализует IDisposable и поэтому вы должны вызывать Dispose на этих объектах, когда вы закончили с ними, чтобы предотвратить проблемы.
Вы также можете изменить значение опроса в запросах, если вам нужно, чтобы событие было увеличено быстрее после запуска процесса. Для этого измените строку "WITHIN 10" на то, что будет меньше 10.
Ответ 2
WMI может создавать события при создании процессов. Затем вы можете фильтровать эти события.
Ответ 3
Вот код.
Обратите внимание, что для выполнения этого кода необходимо запустить Visual Studio, например, Administrator.
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);
}
}
}
}