Как контролировать выполнение процесса / программы в Windows? - PullRequest
10 голосов
/ 04 февраля 2009

Мы пытаемся разработать небольшое приложение, которое может отслеживать программы / процессы, выполняющиеся на машине с Windows.

Если программа / процесс не предполагается запускать, его следует заблокировать. Работает аналогично антивирусу.

Это основная идея.

Я хочу знать, как подключиться к ОС, чтобы получать уведомления о каждой программе / процессе, выполняемом на машине.

Ответы [ 3 ]

11 голосов
/ 15 февраля 2009

Самый простой способ - использовать WMI. Специально следить за Win32_ProcessStartTrace. Это лучше, чем Win32_Process, потому что он настроен на использование событий, тогда как Win32_Process требует опроса, который требует больше ресурсов процессора. Ниже описано, как это сделать в C #. Сначала убедитесь, что System.Management настроен как справочник для вашего проекта.

    public System.Management.ManagementEventWatcher mgmtWtch;

    public Form1()
    {
        InitializeComponent();
        mgmtWtch = new System.Management.ManagementEventWatcher("Select * From Win32_ProcessStartTrace");
        mgmtWtch.EventArrived += new System.Management.EventArrivedEventHandler(mgmtWtch_EventArrived);
        mgmtWtch.Start();
    }

    void mgmtWtch_EventArrived(object sender, System.Management.EventArrivedEventArgs e)
    {
        MessageBox.Show((string)e.NewEvent["ProcessName"]);
    }

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        mgmtWtch.Stop();
    }

Код будет генерировать окно сообщения при каждом запуске нового процесса. Оттуда вы можете проверить белый / черный список и действовать соответствующим образом.

0 голосов
/ 04 февраля 2009

Я бы проверил Win32-api SetWindowsHookEx с константой WH_GETMESSAGE, чтобы добавить обратный вызов в вашу программу при создании нового окна.

http://pinvoke.net/default.aspx/user32.SetWindowsHookEx

Google этот API и WH_GETMESSAGE, чтобы узнать больше.

Также ознакомьтесь со следующими статьями / библиотеками кодов: http://www.vbaccelerator.com/home/Vb/Code/Libraries/Hooks/vbAccelerator_Hook_Library/article.asp

http://www.codeproject.com/KB/DLL/hooks.aspx?fid=2061&df=90&mpp=25&noise=3&sort=Position&view=Quick&fr=76&select=726975

0 голосов
/ 04 февраля 2009

Я не пытался получать уведомления в режиме реального времени. Однако, как запустить запущенные процессы в C #

using System.Diagnostics;

 //Somewhere in your method

Process[] runningList = Process.GetProcesses();

foreach(Process p in runningList){
Console.WriteLine("Process: {0} ID: {1}", p.ProcessName, p.Id);
}

Вы также можете использовать следующие реквизиты процесса

  • StartTime - показывает время начала процесса
  • TotalProcessorTime - показывает количество процессорного времени, которое занял процесс
  • Threads - дает доступ к коллекции потоков в процессе
...