如何监控Windows中的进程/程序执行?

时间:2009-02-04 07:15:17

标签: windows events process executable

我们正在尝试开发一个可以监视在Windows机器上执行的程序/进程的小应用程序。

如果程序/进程不应该运行,则应该阻止它。它的工作原理类似于防病毒软件。

这是基本的想法。

我想知道如何挂钩操作系统以获得有关尝试在机器中运行的每个程序/进程的通知。

3 个答案:

答案 0 :(得分:10)

最简单的方法是使用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 :(得分: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);
}

您还可以使用以下过程道具

  • StartTime - 显示流程开始的时间
  • TotalProcessorTime - 显示进程所花费的CPU时间
  • 线程 - 允许访问流程中的线程集合

答案 2 :(得分:0)

我会使用常量WH_GETMESSAGE检查Win32-api SetWindowsHookEx ,以便在创建新窗口时为程序添加回调。

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