有没有办法保护我的Delphi应用程序不被Windows任务管理器(或其他进程管理器)终止?我认为Windows消息可以做到这一点(通过执行挂钩并拦截TerminateProcess消息)。我想要一个这种保护的例子。卡巴斯基反病毒套件是这样的;我们不能在任务管理器中结束它们的进程。
hmae6n7t1#
正如Kornel所说,对用户隔离的进程有操作系统级别的保护。但一般而言,没有办法阻止您的进程被拥有权限的用户终止。并且用户具有终止以该用户身份运行的进程的权限。即使您想以系统身份运行它,也不能使用此进程与登录的用户交互。您需要将其作为服务运行,并且它将没有图形用户界面。您可以尝试其他方法,例如将DLL加载到诸如EXPLORER.EXE这样的进程中,这样用户不会因为他们不想终止而终止,但这只是滥用。如果开发人员只能编写不能终止的应用程序,对最终用户来说将是非常糟糕的情况。如果这是一个内部应用程序,您可以检查服务器故障,看看是否有某种方法可以通过组策略来实现它。
lyr7nygr2#
像卡巴斯基这样的反病毒程序可能会使用驱动程序并使用挂钩来防止终止。在您的情况下,我建议在进程上设置一个ACL,这样可以防止使用任务管理器或cmdline工具终止(如果用户没有调试权限)。当然,用户始终可以使用Process Explorer之类的工具、获得流程的所有权、设置新的ACL并终止。如果用户不是管理员,则在不同的用户上下文中运行该流程就足够了(例如,从服务启动它)。使用Jedi Windows Security Library设置进程ACL非常容易,如下面的sample所示。
hk8txs483#
这是一个非常糟糕的主意。如果您的程序在别人的计算机上运行,则它在他们的财产上,而不是在您的财产上,并且需要在他们的家中充当访客。这意味着你不会表现得好像你拥有这个地方一样,你当然也不会告诉电脑的所有者他不能用自己的财产做什么,比如杀死他不想运行的任务。如果这样做,那么您的程序并不比恶意软件好,很可能会被视为恶意软件。
8e2ybdfx4#
我认为你问错了问题。您试图以错误的方式解决“如果与服务器聊天中途中断连接怎么办”的问题。答案是不是拒绝进程终止*,而是“预见连接问题并编写错误回退码”!为什么?原因,显然,连接终止可能是由于网络问题(您不能拒绝您的用户将机器从网络上拔出),而不是客户端的终止!Why can't you trap TerminateProcess?如果您担心应用程序崩溃--只需使用Application Restart & Recovery API即可。
sbtkgmzw5#
最简单的方法是:您只需启动2个进程,然后让它们相互“看”一眼。如果其中一个进程已关闭,则让另一个进程重新启动。它将防止新手(如您所说)扼杀这一过程。抱歉,我认为您的“服务器/客户端应用程序”具有特洛伊木马/后门能力。“客户端APP发送一些有用的数据”,“无法杀死的进程”(在你的评论中)对我来说似乎太可疑了。
a14dhokn6#
创建NT服务项目,服务进程不能用进程管理器终止,而是由内部服务管理器控制。
6条答案
按热度按时间hmae6n7t1#
正如Kornel所说,对用户隔离的进程有操作系统级别的保护。但一般而言,没有办法阻止您的进程被拥有权限的用户终止。并且用户具有终止以该用户身份运行的进程的权限。
即使您想以系统身份运行它,也不能使用此进程与登录的用户交互。您需要将其作为服务运行,并且它将没有图形用户界面。您可以尝试其他方法,例如将DLL加载到诸如EXPLORER.EXE这样的进程中,这样用户不会因为他们不想终止而终止,但这只是滥用。
如果开发人员只能编写不能终止的应用程序,对最终用户来说将是非常糟糕的情况。如果这是一个内部应用程序,您可以检查服务器故障,看看是否有某种方法可以通过组策略来实现它。
lyr7nygr2#
像卡巴斯基这样的反病毒程序可能会使用驱动程序并使用挂钩来防止终止。在您的情况下,我建议在进程上设置一个ACL,这样可以防止使用任务管理器或cmdline工具终止(如果用户没有调试权限)。当然,用户始终可以使用Process Explorer之类的工具、获得流程的所有权、设置新的ACL并终止。
如果用户不是管理员,则在不同的用户上下文中运行该流程就足够了(例如,从服务启动它)。
使用Jedi Windows Security Library设置进程ACL非常容易,如下面的sample所示。
hk8txs483#
这是一个非常糟糕的主意。如果您的程序在别人的计算机上运行,则它在他们的财产上,而不是在您的财产上,并且需要在他们的家中充当访客。这意味着你不会表现得好像你拥有这个地方一样,你当然也不会告诉电脑的所有者他不能用自己的财产做什么,比如杀死他不想运行的任务。如果这样做,那么您的程序并不比恶意软件好,很可能会被视为恶意软件。
8e2ybdfx4#
我认为你问错了问题。
您试图以错误的方式解决“如果与服务器聊天中途中断连接怎么办”的问题。答案是不是拒绝进程终止*,而是“预见连接问题并编写错误回退码”!
为什么?原因,显然,连接终止可能是由于网络问题(您不能拒绝您的用户将机器从网络上拔出),而不是客户端的终止!
Why can't you trap TerminateProcess?
如果您担心应用程序崩溃--只需使用Application Restart & Recovery API即可。
sbtkgmzw5#
最简单的方法是:您只需启动2个进程,然后让它们相互“看”一眼。
如果其中一个进程已关闭,则让另一个进程重新启动。它将防止新手(如您所说)扼杀这一过程。
抱歉,我认为您的“服务器/客户端应用程序”具有特洛伊木马/后门能力。“客户端APP发送一些有用的数据”,“无法杀死的进程”(在你的评论中)对我来说似乎太可疑了。
a14dhokn6#
创建NT服务项目,服务进程不能用进程管理器终止,而是由内部服务管理器控制。