2009-02-04 50 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