You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 00:06:23