如何获取Windows 10已安装程序对应的进程名?附现有实现代码
进程黑名单监控与终止实现方案
核心逻辑
放弃依赖注册表Uninstall路径获取已安装程序的方式(该方式仅覆盖正规安装的程序,绿色版、便携程序无法被捕获),改为实时监控系统进程:当有新进程启动时,将其进程名(或可执行文件路径)与预设黑名单比对,匹配则立即终止进程。
实现方案
方式1:轮询检测(简单易实现)
通过定时轮询系统所有进程,对比黑名单,适合轻量场景:
using System; using System.Collections.Generic; using System.Diagnostics; using System.Threading; class ProcessBlacklistMonitor { // 黑名单:可添加进程名(如"notepad")或完整可执行路径(如"C:\\Tools\\xxx.exe") private static readonly HashSet<string> Blacklist = new HashSet<string>(StringComparer.OrdinalIgnoreCase) { "notepad", "chrome", "C:\\Program Files\\SomeBadApp\\bad.exe" }; static void Main(string[] args) { // 需要管理员权限才能终止部分系统进程 Console.WriteLine("进程黑名单监控已启动,按任意键退出..."); while (!Console.KeyAvailable) { CheckAndTerminateBlacklistedProcesses(); Thread.Sleep(1000); // 每秒检测一次,可调整间隔 } } private static void CheckAndTerminateBlacklistedProcesses() { foreach (Process process in Process.GetProcesses()) { try { // 两种匹配方式:进程名 或 完整路径,按需选择 bool isBlacklisted = Blacklist.Contains(process.ProcessName) || Blacklist.Contains(process.MainModule?.FileName); if (isBlacklisted) { Console.WriteLine($"发现黑名单进程:{process.ProcessName}(PID: {process.Id}),正在终止..."); process.Kill(); process.WaitForExit(); } } catch (Exception ex) { // 捕获无权限、进程已退出等异常 Console.WriteLine($"处理进程{process.ProcessName}时出错:{ex.Message}"); } finally { process.Dispose(); } } } }
方式2:WMI事件监控(高效实时)
通过WMI监听系统的进程创建事件,无需轮询,资源占用更低,适合长期运行的监控服务:
using System; using System.Management; using System.Diagnostics; class WMIProcessBlacklistMonitor { private static readonly HashSet<string> Blacklist = new HashSet<string>(StringComparer.OrdinalIgnoreCase) { "notepad", "chrome", "C:\\Program Files\\SomeBadApp\\bad.exe" }; static void Main(string[] args) { Console.WriteLine("WMI进程黑名单监控已启动,按任意键退出..."); // 监听Win32_ProcessStartTrace事件,捕获新进程启动 WqlEventQuery query = new WqlEventQuery("SELECT * FROM Win32_ProcessStartTrace"); ManagementEventWatcher watcher = new ManagementEventWatcher(query); watcher.EventArrived += OnProcessStarted; watcher.Start(); Console.ReadKey(); watcher.Stop(); } private static void OnProcessStarted(object sender, EventArrivedEventArgs e) { try { // 获取新启动的进程ID和可执行路径 uint processId = (uint)e.NewEvent["ProcessID"]; string processPath = e.NewEvent["ExecutablePath"]?.ToString(); if (processPath == null) return; Process process = Process.GetProcessById((int)processId); string processName = process.ProcessName; // 对比黑名单 if (Blacklist.Contains(processName) || Blacklist.Contains(processPath)) { Console.WriteLine($"发现黑名单进程:{processName}(PID: {processId}),正在终止..."); process.Kill(); process.WaitForExit(); } process.Dispose(); } catch (Exception ex) { Console.WriteLine($"处理新进程时出错:{ex.Message}"); } } }
注意事项
- 权限要求:程序需要以管理员身份运行,否则无法终止部分系统进程或高权限进程。
- 匹配精度:仅用进程名可能出现重名误杀(如多个程序都叫"client.exe"),建议优先使用完整可执行文件路径加入黑名单。
- 异常处理:进程可能在检测到之前已退出,或无权限终止,需添加异常捕获避免程序崩溃。
内容的提问来源于stack exchange,提问作者E Lon Mask
相关产品推荐
相关产品推荐

