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

10
我们正在开发一个小应用程序,它可以监视在Windows机器上执行的程序/进程。如果该程序/进程不应该运行,它将被阻止。它类似于杀毒软件。这是基本想法。我想知道如何钩入操作系统以便得到通知关于每个单独的程序/进程试图在计算机上运行的方式。
3个回答

11

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

这段代码将在每次启动新进程时生成一个消息框。 从那里,您可以检查白名单/黑名单并采取适当的措施。


2
不幸的是,WMI 似乎比进程创建时间晚了多达 5 秒才能提供通知。对于实时通知或处理短暂任务没有用处。 - Vladimir Panteleev
1
我在微软网站上找到了一个相同任务的示例这里,但它也存在同样的问题。 - Vladimir Panteleev
使用WMI比手动轮询进程列表更加消耗CPU(因为它发生在WMI服务进程中而不是您的进程中)。此外,如果您的应用程序崩溃,订阅将继续在WMI服务中运行,占用CPU... - Vladimir Panteleev

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


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 时间
  • Threads - 允许访问进程中线程的集合

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接