如何禁止普通用户终止进程?
Posted
技术标签:
【中文标题】如何禁止普通用户终止进程?【英文标题】:how to forbid process termination by regular user? 【发布时间】:2011-07-26 08:18:50 【问题描述】:我无法将其实现为 Windows 服务,因为我的进程必须与桌面交互,并且在 Windows 7 中被禁止。
完成此任务的最简单方法是什么?从另一个(特权)用户开始?如何做到这一点?
我的用户不是黑客,只是一个操作员,所以一些“愚蠢”的方法,比如从任务管理器中隐藏也会有所帮助。
编辑:根据提供的答案进行一些澄清
我的进程没有任何 GUI,所以我试图避免从任务管理器中杀死该进程
我的进程是一个监控系统的客户端,它必须监控用户的桌面,所以它必须与桌面交互
编辑 2:
我可以使用 Windows 服务在系统帐户下的用户会话中启动单独的进程吗(因为我的服务在系统帐户下运行)?用户可以杀死这个子进程吗?
【问题讨论】:
Prevent user process from being killed with "End Process" from Process Explorer的可能重复 【参考方案1】:您可以使用组策略disable the task manager 并隐藏应用程序窗口中的关闭按钮以及 [Alt+F4] 上的反应。
【讨论】:
修复比问题更糟糕吗?任务管理器是一个关键的诊断工具。当然,这不是列出/操作 Windows 内置进程的唯一方法(例如,PSH 中的Stop-Process
)。
@Richard:我的用户不需要诊断系统,他们有专门的技术人员。可能这是我要求的一种可接受的“愚蠢”方法,仍在等待其他建议......
@AndyT:我避免对您所说的“操作员”(例如帮助台操作员)做出假设。
Don't use global state to manage a local problem.【参考方案2】:
经过长时间的挖掘,我在这里找到了可以接受的答案:Prevent user process from being killed with "End Process" from Process Explorer
如果您以普通用户身份登录,则可以正常工作,您无法从 Process Explorer 中终止该进程。管理员仍然可以杀死它,因为有足够的权限。这正是我所需要的
【讨论】:
【参考方案3】:关闭(根)窗口并不意味着停止进程——当消息泵循环存在时,您可以使用新窗口重新启动它(显然,如果您使用的是框架,则可能有一个包装器) .
但如果用户拥有一个 windows 对象(如进程),他们总是可以删除(终止)它。但是,作为不同的用户运行,用户的凭据需要以一种可供当前用户运行的启动器访问的方式存储。
为了更具体地提供帮助,我认为我们需要了解原因:
因为我的进程必须与桌面交互
是一个要求。
【讨论】:
第一个选项(有效地忽略WM_CLOSE
)对于所述目标来说已经足够了。考虑到上下文,幸存TerminateProcess()
可能是矫枉过正。【参考方案4】:
来自MSDN blog:
这就是你的做法:
通过调用获取用户令牌
WTSQueryUserToken (WTSGetActiveConsoleSessionId (), &hToken) ;
在 CreateProcessAsUser 中使用此令牌。
您只需从您的服务中调用WTSQueryUserToken
,然后启动该进程 - 它也适用于 Windows 7!
【讨论】:
+1 非常有趣的链接。但这不是一个完整的故事!按照您的建议,我将在登录用户下创建交互式进程,因此它可以由该登录用户终止。我尽量避免这种情况。如何在系统帐户下运行此服务?该博客文章中的1.B
案例听起来很相似。因此,我可以在登录帐户(如您所述)下创建临时进程,并从那里创建带有系统帐户令牌的 CreateProcessAsUser。但是如何将系统帐户令牌从我的服务传递到该临时进程?
我了解您的问题。不知道“如何”实现这一点,但这是可能的 - 尽管 NAV 的进程“ccSvcHst.exe”在我的用户帐户下运行,但我无法终止它。它可能使用SetKernelObjectSecurity
删除帐户的所有ACL(或将它们设置为“拒绝”)。以上是关于如何禁止普通用户终止进程?的主要内容,如果未能解决你的问题,请参考以下文章
Linux脚本练习之script015-实现禁止和允许普通用户登录系统。