Подтвердить что ты не робот

Мониторинг при запуске exe

У меня есть некоторые сервисы, которые нужно запустить для работы некоторых функций приложения. Я хотел бы включить возможность запускать внешние службы Windows для инициализации после запуска приложения. (в отличие от того, что они автоматически запускаются с аппаратом и занимают память, когда приложение не требуется)

У меня нет доступа к exe-коду для его реализации, поэтому в идеале я хотел бы написать службу С#.Net Windows, которая будет отслеживать, когда запускается exe.

То, что я нашел до сих пор, - System.IO.FileSystemEventHandler. Этот компонент обрабатывает только измененные, созданные, удаленные и переименованные типы событий. Я не ожидаю, что компонент файловой системы станет идеальным местом для поиска того, что я ищу, но не знаю, куда еще идти.

Возможно, я не ищу подходящие ключевые слова, но я еще не нашел ничего чрезвычайно полезного в Google или здесь, на stackoverflow.com.

Решение будет необходимо запускать на XP, Vista и Win 7, когда оно придет...

Спасибо заранее за любые указатели.

4b9b3361

Ответ 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-битном адресном пространстве.