2009-02-04 47 views
9

我們正在嘗試開發一個小應用程序,它可以監視在Windows機器上執行的程序/進程。如何在Windows中監視進程/程序的執行?

如果程序/進程不應該運行,它應該被阻止。它的作用類似於防病毒。

這是基本的想法。

我想知道如何掛鉤進入操作系統,以獲得試圖在機器上運行的每一個程序/進程的通知。

回答

9

最簡單的方法是使用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(); 
    } 

該代碼將在您每次啓動新進程時生成一個消息框。從那裏你可以檢查白名單/黑名單,並採取適當的行動。

+1

不幸的是,WMI似乎在創建進程後最多5秒內發送通知。對於實時通知或對短期任務執行任何操作都無用。 – 2013-08-09 04:59:32

0

我沒有嘗試創建實時通知。如何過,這裏是如何讓運行在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); 
} 

您還可以使用過程中的以下道具

  • 開始時間 - 顯示進程的啓動
  • TotalProcessorTime時間 - 顯示進程所花費的CPU時間量
  • 線程 - 提供對進程中線程集合的訪問
0

我會檢查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

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