Как контролировать процесс / выполнение программы в windows?
мы пытаемся разработать небольшое приложение, которое может контролировать программы/процессы, выполняемые на компьютере с windows.
Если программа / процесс не должна выполняться, она должна быть заблокирована. Он работает подобно антивирусу.
Это основная идея.
Я хочу знать, как подключиться к ОС, чтобы получить уведомление о каждой программе/процессе, пытающемся запустить в машине.
3 ответов
самый простой способ-использовать WMI. Специально следить за Win32_ProcessStartTrace. Это лучше, чем Win32_Process, потому что он настроен на использование событий, тогда как Win32_Process требует опроса, который является более интенсивным процессором. Ниже показано, как это сделать на C#. Сначала убедитесь, что эта система.Управление настраивается как ссылка для вашего проекта.
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();
}
код будет генерировать сообщение каждый раз, когда вы запускаете новый процесс. Оттуда вы можете проверить белый список/черный список и действовать соответственно.
Я не пробовал получать уведомления в режиме реального времени. Как бы то ни было, вот как получить запущенные процессы в 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-предоставляет доступ к коллекции потоков в процессе
Я бы проверил 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