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

如何在windows中监视进程/程序的执行?,windows,events,process,executable,Windows,Events,Process,Executable,我们正在尝试开发一个小型应用程序,它可以监控在windows机器上执行的程序/进程 如果程序/进程不应运行,则应阻止它。它的工作原理类似于防病毒软件 这是基本思想 我想知道如何连接到操作系统中,以获得有关试图在计算机中运行的每个程序/进程的通知。我没有尝试获取实时通知。然而,下面是如何在C中运行进程# 您还可以使用以下流程道具 StartTime-显示进程开始的时间 TotalProcessorTime-显示进程占用的CPU时间量 线程-允许访问进程中的线程集合 我将使用常量WH_GETMES

我们正在尝试开发一个小型应用程序,它可以监控在windows机器上执行的程序/进程

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

这是基本思想


我想知道如何连接到操作系统中,以获得有关试图在计算机中运行的每个程序/进程的通知。

我没有尝试获取实时通知。然而,下面是如何在C中运行进程#

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

  • StartTime-显示进程开始的时间
  • TotalProcessorTime-显示进程占用的CPU时间量
  • 线程-允许访问进程中的线程集合

我将使用常量WH_GETMESSAGE检查Win32 apiSetWindowsHookEx,以便在创建新窗口时向程序添加回调

谷歌API和WH_GETMESSAGE以了解更多信息

还可以查看以下文章/代码库:


最简单的方法是使用WMI。专门监视Win32_进程StartTrace。这比Win32_进程要好,因为它被设置为使用事件,而Win32_进程需要轮询,这更需要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();
    }

每次启动新流程时,代码都会生成messagebox。从那里,您可以检查白名单/黑名单,并采取适当的行动。

不幸的是,WMI似乎会在创建流程后5秒钟内发送通知。不适用于实时通知或处理短期任务。我在Microsoft网站上找到了一个相同任务的示例,但它也有相同的问题。嘎。。。使用WMI比手动轮询进程列表更占用CPU(它只发生在WMI服务进程而不是您的进程中)。此外,如果应用程序崩溃,订阅将继续在WMI服务中运行,占用CPU。。。
    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();
    }