【问题标题】:How to list Windows Services from within a Service如何从服务中列出 Windows 服务
【发布时间】:2012-05-04 22:55:39
【问题描述】:

sc query state= all 在命令行中按预期工作。

在另一个服务中,sc query state= all 不会向该子进程的标准输出打印任何内容(当然是由父进程捕获的)。

服务是否需要权限/特权才能列出/启动/停止其他服务?


一点背景知识:我正在制作一个定期重启一些行为不端的服务的服务。

【问题讨论】:

  • 嗯,写完我的答案后,我注意到您甚至没有指定您使用的编程语言。
  • 首先,检查您的代码在作为常规应用程序而不是作为服务运行时是否正常工作。

标签: windows service windows-services


【解决方案1】:

好吧,不要这样做,至少不要以阻塞的方式。为了让您自己的服务响应 SCM(服务控制管理器)以返回其状态,该服务必须能够执行其调度程序代码。这意味着如果您调用该程序并等待它退出,您将无限期地等待。缓解这种情况的一种方法是将其放入单独的线程中,这样它就不会阻塞您的调度,并且您的服务将继续与 SCM 对话。

或者(可能更好)您可以使用EnumServicesStatusEx 函数与 SCM 对话并自己查询其他服务的状态。该函数本身并没有提及任何关于阻塞的内容,因此您必须自己弄清楚是否是阻塞,然后再次使用线程来防止您的服务停止与 SCM 对话。

最后一点:如果那些行为不端的服务是你的,你应该更可能修复相应的代码。我有一部分遗留代码,并且有一个行为不端的服务,它有自己的帮助应用程序作为“故障操作”(可以在服务配置中配置为SERVICE_CONFIG_FAILURE_ACTIONS),它会在服务崩溃时启动并重新启动服务。一旦我接管了该代码,找出原因并修复它,服务再次稳定,不再需要该应用程序。

【讨论】:

  • 调度程序调用总是发生在单独的线程中,因此 ServiceMain 线程是否阻塞无关紧要。
  • @Harry Johnston:好吧,因为他没有显示 在哪里 他调用了这个过程,所以我不想假设。但感谢您的澄清。
猜你喜欢
  • 1970-01-01
  • 2011-07-25
  • 2011-02-17
  • 2010-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多