阻止C#应用程序被进程终止

我怎样才能保护我的C#应用​​程序通过taskman或编程方式杀死其进程?

这是我的情况:

应用程序A是另一个团队开发的MFC应用程序。 它有一个未发布的基于文本的远程接口,通过后门启用。

我正在开发应用程序B,一个与A交互的C#WinForms应用程序。当需要远程访问时,A使得A的后门在完成(或失败)时closures它。

我正在探索用户可能滥用B的方式,以便获得对A的隐藏function的访问权限,例如在启用A的远程接口后杀死B的进程。 如果发生这种情况,我想让B有最后一次机会来closuresA的后门。

B使用localhost与A进行交互,所以我不担心掉电情况。

我正在寻找一个不涉及更改A的解决scheme。

我不希望能够阻止黑暗切线(虽然这将是一个奖金),但现在一个脚本小子可以有他的方式与这个devise:)

这些应用程序在Windows XP上运行,但也将很快支持Vista和7。

先谢谢了,吉姆

你不能 – 只要用户有权在你的程序中调用TerminateProcess,你不能在任务管理器中立即阻止End Process立即杀死你。 Raymond Chen前段时间发帖: http : //blogs.msdn.com/b/oldnewthing/archive/2004/02/16/73780.aspx

你真的,真的不想这样做。 这让用户非常生气! 但是,如果它应该是一个服务,运行它作为一个服务帐户,不给用户的管理员权限。

我很乐意关闭应用程序,当他们尝试,但需要先做一些事情。

在程序关闭时进行必要的步骤会导致容易中断的脆弱程序。 即使您可以通过任务管理器阻止某人杀死您的程序,也不能阻止他们关闭计算机,甚至不能将电缆拉出墙壁。 无论完成那么重要的任务都会丢失。 那如果有停电呢? 再次,你的任务将不会完成,你的重要清理代码将不会运行。

相反,你应该让你的程序在任何时候都失败。 使用事务,并始终以原子方式将状态保存到文件 – 确保始终至少有一个有效的数据副本。 不要以重复的文件暂时无效的方式覆盖重要的文件。

最后,你可以添加一个对话框到你的程序中,当他们试图关闭它时,警告他们程序需要正常关闭。 如果你让你的关机速度很快,用户不会想要杀死它,并会让它正常终止。 如果你的关机时间很长,那么人们会试图杀死它。 如果你对用户很好,他们也会对你很好。

如果快速关闭意味着用户将失去一些未完成的工作,然后警告他们这个问题,让他们有机会等待任务完成,但如果他们真的要退出程序,就让他们退出。

简短的回答:你不能,你不应该。

长答案:您可以尝试启动第二个“帮助程序”进程,如果您的应用程序仍在运行,则会每隔x秒检查一次。 如果不是,则重新启动。

如果你想让一个进程运行很长时间,就不要相信用户保持运行,那就考虑一下windows服务。 他们是为此而设计的。

我想每个人都错过了这一点。 如果我正确地读了它(在你编辑之后),你想知道什么时候你被“杀死”了,所以你可以优雅地关闭?

“杀”的意思是你“不能”阻止它。 当然有一些解决方法,比如使用第二个应用程序来重新激活一个被杀的应用程序,但这与简单地能够正常关闭无关。

最好的方法是作为一个服务来运行(所以你不能被杀死,只是被要求关闭),或者改变你的应用程序的工作方式,以便在它退出之前不需要“整理”。 当一个应用程序退出时,它所拥有的大部分资源都会自动清理,因此只有您自己的数据才能完全关闭。 您可以尝试的方法是:

  • 经常将您的状态提交到磁盘,以防止您意外退出时不会丢失太多(或任何东西)。 (请记住刷新所有I / O流以确保它们被提交到磁盘)
  • 将信息保存到磁盘,以便在下次运行程序时检测到意外的关闭,以便能够检测并纠正可能由于死亡而导致的任何问题。
  • 告诉你的用户不要成为白痴,并很好地退出你的应用程序。 如果他们不理睬你,就戳他们的眼睛。 通常不超过两次,他们听:-)

为了防止您的应用程序被终止,您以另一个用户作为服务或另一个用户帐户)运行您的应用程序,并将用户限制为标准用户

这样,没有恶意的用户可以杀死你的进程,因为只有管理员可以杀死它,这是你的一个特权,显然,不信任任何人。

它具有遵循操作系统的预期设计的优点。

@Jim

如果应用程序A可以收到修改请求

  1. 我最好是在开放后门时注册所有App B的体系结构,并且需要以一定的时间间隔登录App A,以便App A可以在App B不通知它仍然需要访问时关闭它自己的后门。 这仍然不是绝对安全的,但是应用程序A不应该被构造为具有这样的接口,而没有用于“安全”通信手段的某种自我调节。

  2. 或者,你可以建议应用程序A被修改来检查有效的进程,如果在后门打开的时候没有被发现,那么它将被关闭(这是可伪造的,因为它是经过处理的名称)。

否则,听起来应用程序B应该尽可能频繁地关闭后门,而不需要立即访问。

要求应用程序B提供访问应用程序A的安全性确实是一个糟糕的模式。

据我所知你不能,即使你真的不能。 想象一下,如果你不能强制杀死一个应用程序将会是多么的恼人。

如果你的应用程序保持运行的重要性,你总是可以创建一个“ping”应用程序以确保它正在运行的windows服务(你可以使用命名管道,套接字,pid文件等等)。 如果服务检测到进程已经死了,那么它可以重新启动它。 这可能是你最好的选择。

当应用程序第一次启动时,你可以不执行在后台运行的第三个进程/进程,并尝试每隔一段时间回调到应用程序B,所以当应用程序B关闭时,应用程序C可以看到并执行关闭App A的后门程序。

所以,当应用程序B通过预期的关闭按钮成功关闭它将禁用应用程序C从检查应用程序B仍然工作正常…

我不是现在最好的与C#,但看看你的问题,这可能是我会试图做到这一点的方式之一..

此外,如果应用程序B也检查应用程序C以及如果应用程序C已经关闭应用程序B将关闭后门,如果可以的话。

正如其他人所说,这可能不是一个好主意。