我们正在尝试开发一个小应用程序,它可以监视在Windows机器上执行的程序/进程。如何在Windows中监视进程/程序的执行?
如果程序/进程不应该运行,它应该被阻止。它的作用类似于防病毒。
这是基本的想法。
我想知道如何挂钩进入操作系统,以获得试图在机器上运行的每一个程序/进程的通知。
我们正在尝试开发一个小应用程序,它可以监视在Windows机器上执行的程序/进程。如何在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);
}
您还可以使用过程中的以下道具
我会检查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
不幸的是,WMI似乎在创建进程后最多5秒内发送通知。对于实时通知或对短期任务执行任何操作都无用。 – 2013-08-09 04:59:32