我們正在嘗試開發一個小應用程序,它可以監視在Windows機器上執行的程序/進程。如何在Windows中監視進程/程序的執行?
如果程序/進程不應該運行,它應該被阻止。它的作用類似於防病毒。
這是基本的想法。
我想知道如何掛鉤進入操作系統,以獲得試圖在機器上運行的每一個程序/進程的通知。
我們正在嘗試開發一個小應用程序,它可以監視在Windows機器上執行的程序/進程。如何在Windows中監視進程/程序的執行?
如果程序/進程不應該運行,它應該被阻止。它的作用類似於防病毒。
這是基本的想法。
我想知道如何掛鉤進入操作系統,以獲得試圖在機器上運行的每一個程序/進程的通知。
最簡單的方法是使用WMI。特別監視Win32_ProcessStartTrace。這比Win32_Process更好,因爲它設置爲使用事件,而Win32_Process需要更佔用CPU的輪詢。以下是如何在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();
}
該代碼將在您每次啓動新進程時生成一個消息框。從那裏你可以檢查白名單/黑名單,並採取適當的行動。
我沒有嘗試創建實時通知。如何過,這裏是如何讓運行在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);
}
您還可以使用過程中的以下道具
我會檢查Win32-api SetWindowsHookEx與恆定的WH_GETMESSAGE添加一個回調到您的程序,當一個新窗口正在創建。
http://pinvoke.net/default.aspx/user32.SetWindowsHookEx
谷歌認爲API和WH_GETMESSAGE以瞭解更多信息。
還檢查了以下文章/代碼圖書館的: http://www.vbaccelerator.com/home/Vb/Code/Libraries/Hooks/vbAccelerator_Hook_Library/article.asp
不幸的是,WMI似乎在創建進程後最多5秒內發送通知。對於實時通知或對短期任務執行任何操作都無用。 – 2013-08-09 04:59:32