sc query state= all
は、コマンドラインから期待通りに機能します。サービス内からWindowsサービスを一覧表示する方法
別のサービスの中から、sc query state= all
は、そのサブプロセスのstdout(もちろん親によって取得されたもの)に何も印刷しません。
サービスが他のサービスの一覧表示/開始/停止を行うために必要な権限/特権がありますか?
ちょっとした背景:定期的に不正なサービスを再開するサービスを作成しています。
sc query state= all
は、コマンドラインから期待通りに機能します。サービス内からWindowsサービスを一覧表示する方法
別のサービスの中から、sc query state= all
は、そのサブプロセスのstdout(もちろん親によって取得されたもの)に何も印刷しません。
サービスが他のサービスの一覧表示/開始/停止を行うために必要な権限/特権がありますか?
ちょっとした背景:定期的に不正なサービスを再開するサービスを作成しています。
まあ、少なくとも1つはブロックしないでください。自分のサービスがステータスを返すためにSCM(Service Control Manager)に応答するためには、サービスはディスパッチャコードを実行できる必要があります。つまり、このプログラムを呼び出してプログラムが終了するまで待つと、無限に待機します。これを軽減する1つの方法は、これを別のスレッドに入れてディスパッチをブロックしないようにすることで、サービスは引き続きSCMと通信します。
また、EnumServicesStatusEx
関数を使用してSCMと通信したり、他のサービスのステータスについて問い合わせることもできます。関数自体には何も言及されていないので、自分自身を把握してからスレッドを再利用して、サービスがSCMとの会話を止めるのを防ぐ必要があります。
最後にメモ:これらの不正なサービスがあなたのものである場合は、それぞれのコードを修正する可能性が高いはずです。私はレガシーコードのシェアを持っていて、クラッシュするたびにいつでもサービスを再起動する "フォールトアクション"(サービス設定でSERVICE_CONFIG_FAILURE_ACTIONS
として設定可能)として独自のヘルパーアプリケーションを持っている1つの不正なサービスを持っていました。私がそのコードを取り上げ、原因を突き止めて修正したら、サービスは再び安定し、そのアプリケーションはもはや本当に必要なくなった。
ディスパッチャー呼び出しは常に別のスレッドで行われるため、ServiceMainスレッドがブロックされているかどうかは関係ありません。 –
@ハリー・ジョンストン:まあ、彼は*どこに*彼がプロセスを呼び出すかを示していないので、私はそれを仮定したくなかった。しかし、明確化のおかげで。 – 0xC0000022L
ええと、私の答えを書いた後、私はあなたが使用したプログラミング言語を指定していないことに気付きました。 – 0xC0000022L
まず、サービスではなく通常のアプリケーションとして実行したときにコードが動作することを確認します。 –