【问题标题】:How to capture that session logoff started from windows service如何捕获从 Windows 服务启动的会话注销
【发布时间】:2011-05-08 18:18:42
【问题描述】:

我有一项服务会不断检查某些应用程序并确保它没有关闭。如果此应用程序关闭 - 服务将再次启动它。

当用户决定注销会话时,问题就开始了。在注销期间,所有应用程序都将关闭,包括我的应用程序。但该服务仍在运行并不断尝试重新启动它。

问题是如何通知服务用户将要注销并且不再需要重新启动应用程序?我尝试使用 SERVICE_CONTROL_SESSIONCHANGE 通知来实现它。但是根据 MSDN,当所有应用程序都已经关闭并且注销程序完成时,它们才会提供服务。对我来说太晚了。有没有办法以编程方式找出当前会话正在注销?

我的服务在 LocalSystem 帐户下启动。

谢谢。

附言我无权访问应用程序源代码。目标需要在不修改的情况下实现。

【问题讨论】:

  • 你为什么不把你的应用程序(至少应该始终运行的部分)变成一个服务?
  • “我的应用程序”是我需要不断运行的应用程序。但不是我写的。

标签: c++ windows service logoff


【解决方案1】:

让您的服务运行两个应用程序:一个是它的看门狗,另一个是您自己实现的。然后,第二个可以通过向服务发送消息来响应注销事件(大卫赫弗南的回答),然后服务将知道不重新启动监视的作业。

【讨论】:

  • 谢谢。我正在考虑这个解决方案,但它似乎并不“整洁”。我最好避免让不必要的应用程序不断运行。
  • @vkjr 如果您无法控制应用程序,那么您可能需要接受一些不整洁
  • @David 只有在没有其他方法的情况下。
  • 总是有其他方法。在某种程度上,你试图完成的事情基本上是混乱和破碎的(我们可以深入了解为什么你需要不断地监视和重新启动在用户会话中运行的程序),所以我谦虚地建议你实现一些东西并继续做更好的事情。
【解决方案2】:

在你的应用和你的服务之间打开一个通信通道,并安排应用告诉服务它因为注销事件而关闭。

【讨论】:

  • 感谢您的建议。不幸的是,这种方式只有在您是应用程序的作者时才有效。就我而言,我需要继续运行第 3 方的应用程序。
  • 这一定是一款非常特别的应用!它是什么?你能把它变成一个像 srvany 这样的服务吗?
  • 我无权访问此应用程序 :) 我的客户没有提供它,所以我正在使用 notepad.exe 测试服务 :) 除非没有其他方法我会仅使用服务功能更好地解决问题。
【解决方案3】:

您可能无法访问可执行文件的源代码,但这并不意味着您不能影响进程。例如,您可以inject a DLL。使用SetWindowsHookEx,您将捕获发送到应用程序主窗口的WM_ENDSESSION

【讨论】:

    【解决方案4】:

    为什么不在运行应用程序的用户下创建服务并告诉它自动启动?在这种情况下,您应该在用户注销时收到 SERVICE_CONTROL_SHUTDOWN 消息,因为该服务也会终止。

    【讨论】:

    • 如果系统正在注销,服务不会收到 SERVICE_CONTROL_SHUTDOWN。仅当它关闭时。
    • 我认为如果你设置一个服务在用户登录时启动并在用户注销时停止你会得到 SERVICE_CONTROL_STOP 然后是 SHUTDOWN 命令。至少这是我在手动停止服务时所经历的(从未尝试过注销,因为我们的用例不支持注销)。
    • 我只经历了 SERVICE_CONTROL_STOP 接收,但无论如何对我来说为时已晚,应用程序在接收时已经关闭。所以我将按照@JohnZwinck 提到的方式进行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-11
    • 1970-01-01
    • 1970-01-01
    • 2020-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多