0

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

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

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


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

4

1 回答 1

0

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

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

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

于 2012-05-04T23:34:49.687 回答