0

sc query state= allコマンドラインから期待どおりに動作します。

別のサービス内からsc query state= all、そのサブプロセスの stdout に何も出力しません (もちろん、親によってキャプチャされます)。

他のサービスをリスト/開始/停止するためにサービスが必要とする許可/特権はありますか?


ちょっとした背景: 私は、動作の悪いサービスを定期的に再起動するサービスを作成しています。

4

1 に答える 1

0

まあ、少なくともブロックする方法では、それをしないでください。独自のサービスがSCM(サービスコントロールマネージャー)に応答してステータスを返すには、サービスがディスパッチャーコードを実行できる必要があります。つまり、このプログラムを呼び出して終了するのを待つと、無期限に待つことになります。これを軽減する1つの方法は、これを別のスレッドに入れて、ディスパッチをブロックせず、サービスがSCMとの通信を継続するようにすることです。

あるいは(そしておそらくもっと良い)、このEnumServicesStatusEx機能を使用してSCMと通信し、他のサービスのステータスについて自分で問い合わせることができます。関数自体はブロックについて何も言及していないため、ブロックされているかどうかを自分で把握してから、スレッドを再度使用して、サービスがSCMとの通信を停止しないようにする必要があります。

最後にもう1つ注意してください。これらの不正なサービスがあなたのものである場合は、それぞれのコードを修正する必要がありますSERVICE_CONFIG_FAILURE_ACTIONS私はレガシーコードを共有していて、クラッシュするたびにサービスを再起動する「障害アクション」(サービス構成で構成可能)として独自のヘルパーアプリケーションを取得する1つの誤動作サービスがありました。そのコードを引き継いで原因を突き止めて修正すると、サービスは再び安定し、そのアプリケーションはもう本当に必要なくなりました。

于 2012-05-04T23:34:49.687 に答える