我们正在开发一个小应用程序,它可以监视在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();
}
这段代码将在每次启动新进程时生成一个消息框。 从那里,您可以检查白名单/黑名单并采取适当的措施。
我建议使用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
我还没有尝试过获取实时通知。不过,以下是如何在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);
}
您还可以使用进程的以下属性: