Мониторинг при запуске exe
У меня есть некоторые сервисы, которые нужно запустить для работы некоторых функций приложения. Я хотел бы включить возможность запускать внешние службы Windows для инициализации после запуска приложения. (в отличие от того, что они автоматически запускаются с аппаратом и занимают память, когда приложение не требуется)
У меня нет доступа к exe-коду для его реализации, поэтому в идеале я хотел бы написать службу С#.Net Windows, которая будет отслеживать, когда запускается exe.
То, что я нашел до сих пор, - System.IO.FileSystemEventHandler. Этот компонент обрабатывает только измененные, созданные, удаленные и переименованные типы событий. Я не ожидаю, что компонент файловой системы станет идеальным местом для поиска того, что я ищу, но не знаю, куда еще идти.
Возможно, я не ищу подходящие ключевые слова, но я еще не нашел ничего чрезвычайно полезного в Google или здесь, на stackoverflow.com.
Решение будет необходимо запускать на XP, Vista и Win 7, когда оно придет...
Спасибо заранее за любые указатели.
Ответы
Ответ 1
Из в этой статье вы можете использовать WMI (пространство имен System.Management
) в своей службе, чтобы наблюдать за событиями запуска процесса.
void WaitForProcess()
{
ManagementEventWatcher startWatch = new ManagementEventWatcher(
new WqlEventQuery("SELECT * FROM Win32_ProcessStartTrace"));
startWatch.EventArrived
+= new EventArrivedEventHandler(startWatch_EventArrived);
startWatch.Start();
ManagementEventWatcher stopWatch = new ManagementEventWatcher(
new WqlEventQuery("SELECT * FROM Win32_ProcessStopTrace"));
stopWatch.EventArrived
+= new EventArrivedEventHandler(stopWatch_EventArrived);
stopWatch.Start();
}
static void stopWatch_EventArrived(object sender, EventArrivedEventArgs e) {
stopWatch.Stop();
Console.WriteLine("Process stopped: {0}"
, e.NewEvent.Properties["ProcessName"].Value);
}
static void startWatch_EventArrived(object sender, EventArrivedEventArgs e) {
startWatch.Stop();
Console.WriteLine("Process started: {0}"
, e.NewEvent.Properties["ProcessName"].Value);
}
}
WMI допускает довольно сложные запросы; вы можете изменить запросы здесь, чтобы вызвать обработчик событий только при запуске вашего наблюдаемого приложения или по другим критериям. Вот краткое введение с точки зрения С#.
Ответ 2
у вас есть 3 варианта:
Надежный/навязчивый, настройте крючок в неуправляемом коде, который сообщает о своем приложении С# при запуске приложения. Это трудно сделать правильно и включает загрузку дополнительной DLL с каждым процессом. (В качестве альтернативы вы можете настроить драйвер, который еще сложнее записать)
Менее надежный способ, перечислить все процессы (с помощью System.Diagnostics.Process class) на регулярной основе (скажем, каждые 10-30 secs), чтобы узнать, запущено ли приложение.
Также возможно наблюдать событие Win32_Process, InstanceCreationEvent WMI из управляемого кода. Не уверен, насколько это достоверно, но я подозреваю, что это будет лучше, чем опросы.
Ответ 3
Мониторинг, если процесс запущен - для этого нужно запустить одну службу.
Если вы действительно не хотите потреблять какие-либо ресурсы - пишите простой сервис на простом C. Приложение-приложение, написанное без MFC/ATL, может потреблять всего 300-400 кб памяти и, как правило, нет циклов процессора. Когда процесс, который вас интересует, вы можете запустить свои С# -сервисы.
Ответ 4
public Process IsProcessOpen(string name)
{
foreach (Process clsProcess in Process.GetProcesses())
if (clsProcess.ProcessName.Contains(name))
return clsProcess;
return null;
}
Ответ 5
В ответ на аспект Windows 7 он не работает. Если вы контролируете 64-битные процессы, ваш процесс должен быть построен для работы в 64-битном адресном пространстве.