English 中文(简体)
如何监视Windows中的进程/程序执行?
原标题:
  • 时间:2009-02-04 07:15:16
  •  标签:

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

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

这是基本的想法。

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

最佳回答

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

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

问题回答

我还没有尝试获得实时通知。无论如何,这是如何在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 - Shows the time the process started
  • TotalProcessorTime - Shows the amount of CPU time the process has taken
  • Threads - gives access to the collection of threads in the process

我会检查Win32-api中的SetWindowsHookEx常量WH_GETMESSAGE,以在新窗口创建时向您的程序添加回调。

将此翻译为中文:http://pinvoke.net/default.aspx/user32.SetWindowsHookEx http://pinvoke.net/default.aspx/user32.SetWindowsHookEx

谷歌API和WH_GETMESSAGE来了解更多信息。

Also check out the following articles/code librarys: 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





相关问题
热门标签