从服务中关闭进程而不杀死进程
Posted
技术标签:
【中文标题】从服务中关闭进程而不杀死进程【英文标题】:Closing process from service without killing the processes 【发布时间】:2014-01-31 19:08:16 【问题描述】:我正在寻找一种方法,通过在系统帐户下运行的 Windows 服务关闭在任何用户下运行的进程。我几乎尝试了一切,但除了终止进程之外我找不到任何解决方案。
为什么我不能终止进程? 我无法终止使用托盘图标的进程。如果我终止进程,托盘图标不会消失。
到目前为止我所做的尝试
我已经尝试过使用全局事件句柄(没有工作,因为子进程变得非常滞后)。
我也尝试使用 PostMessage/SendMessage 与进程进行通信。该解决方案不起作用,因为 Windows 服务无法与任何用户界面交互,...
我发现了另一个问题(在 *** 上),它准确地描述了我的问题:Close a child process from a windows service。 这个问题不包含一个很好的解决方案。
首先,我不使用 C++ 而不是 C#。下一个问题是,子进程使用鼠标钩子。所以它运行得非常快,没有太多开销。否则它会变得滞后,这意味着鼠标会在整个系统上滞后。
那么真的没有简单的解决方案可以从 Windows 服务中关闭进程吗?
【问题讨论】:
你要杀死的进程,你能控制它吗? (更改代码并重建) 是的。我可以把它改成我想要的任何东西。 @python 全局事件对象是显而易见的解决方案,绝对没有理由让子进程滞后。我怀疑您执行此解决方案不正确。 【参考方案1】:服务可以使用SetProcessWindowStation()
和SetThreadDesktop()
附加到目标进程的交互式桌面,然后再向目标进程发送消息。
或者,服务可以使用CreateProcessAsUser()
在与目标进程相同的会话中运行一个新进程,然后该进程可以向目标进程发送消息。
【讨论】:
我刚刚试了一下。 SetProcessWindowStation 不起作用。我现在要试试 SetThreadDesktop 但我担心这也行不通。 好吧。现在我也试过SetThreadDesktop
。两者都没有工作。我只是无法访问任何用户界面。问题是如前所述的“会话 0 隔离”。我必须在不同的会话中启动一个进程。
我最终使用了此处描述的解决方案(请参阅 ApplicationLoader::StartProcessAndBypassUAC):codeproject.com/script/Articles/…
我很确定 SetProcessWindowStation
和 SetThreadDesktop
仅限于与进程关联的远程桌面会话中的窗口站和桌面,因此在 Windows Vista 中它们不会帮助服务尝试与最终用户或最终用户进程交互。以上是关于从服务中关闭进程而不杀死进程的主要内容,如果未能解决你的问题,请参考以下文章