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

如何用C#开发无法通过任务管理器或taskkill终止的程序?求最佳方案

如何开发无法通过任务管理器/taskkill终止的C#应用程序

各方案优缺点分析

1. RegisterServiceProcess

这是仅适用于Windows 9x/NT早期版本的老旧API,当前Win10/11已完全废弃,调用后无任何效果,直接排除。

2. 守护进程(Keep-alive processes)

  • 原理:两个进程互相监控,一方被终止时,另一方立即重启它
  • 优点:实现简单,无需系统权限,兼容现代Windows版本
  • 缺点:用户可通过批量终止操作(如taskkill /f /im *.exe)同时干掉两个进程;频繁重启会额外消耗系统资源

3. 受保护服务(Protected Services)

  • 原理:将程序注册为Windows受保护进程,这类进程仅能被系统级权限进程终止,普通用户甚至无特殊权限的管理员都无法通过任务管理器或taskkill终止
  • 优点:系统原生支持,防护强度最高,Win8及以上版本均兼容
  • 缺点:需微软认可的代码签名证书(或开启测试模式),配置相对复杂,需系统权限完成安装

推荐方案及最佳实践

优先推荐受保护服务,若无法满足签名要求,可选择守护进程+额外防护作为备选。

受保护服务(首选)

  1. 代码签名
    • 需获取微软信任的EV代码签名证书;测试环境下可通过bcdedit /set testsigning on开启测试模式,使用自签名证书
    • 签名后的服务才能被标记为受保护进程
  2. 服务配置
    • 将程序注册为Windows服务,通过SC命令设置保护属性:sc config <服务名> type= own protected= yes,或直接修改注册表对应项
    • 确保服务以LocalSystem账户运行,获取足够系统权限
  3. C#实现要点
    • 基于System.ServiceProcess.ServiceBase编写服务程序,重写OnStart和OnStop方法(注意:受保护服务的OnStop无法被普通调用触发,仅能通过系统级命令终止)
    • 服务避免直接处理UI,如需交互可通过独立UI进程,使用WCF、命名管道等方式与服务通信

守护进程方案(备选)

  1. 互保逻辑设计
    • 两个进程通过命名管道或共享内存建立心跳连接,定期检测对方存活状态
    • 检测到对方终止时,立即调用Process.Start()重启目标进程,必要时以管理员权限启动
  2. 防批量终止优化
    • 给两个进程设置不同的进程名和窗口标题,降低被批量选中的概率
    • 其中一个进程设置隐藏启动:ProcessStartInfo.CreateNoWindow = true且WindowStyle = ProcessWindowStyle.Hidden,减少被发现的可能
  3. C#实现要点
    • 启动进程时设置ProcessStartInfo.UseShellExecute = false,配合隐藏窗口参数实现后台运行
    • 监听Process.Exited事件,触发重启逻辑

重要注意事项

开发此类程序必须遵守用户授权及法律法规,未经允许阻止用户终止程序可能违反软件使用协议或当地法律;受保护服务的防护并非绝对,拥有内核权限的恶意软件仍可绕过,但足以抵御普通用户的常规终止操作。

内容的提问来源于stack exchange,提问作者Arbelac

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 21:33:23