Windowsサービスが実行されているかどうかを確認する方法


182

Windowsサービスとして実装されている「ウォッチドッグ」と通信しているC#(XP組み込みで実行されている2.0)のアプリケーションがあります。デバイスが起動すると、このサービスは通常、開始するのにしばらく時間がかかります。私のコードから、サービスが実行されているかどうかを確認したいと思います。どうすればこれを達成できますか?


1
.NET のServiceControllerオブジェクトをご覧ください。
Larry

うーん... WMI経由で独自にローリングするよりもましです。答えを削除します。
EBGreen 2008年

@EBGreenは-私は知らない、WMIルートは、将来的に他の誰かのために有用である可能性があります皮膚に複数の方法猫、そしてすべてのこと....
カール・

そうですが、ServiceControllerの方が優れていると思うので、削除したままにしておきます。目を覚ましていなければ、WMIを提案することすらなかったでしょう。:)
EBGreen 2008年

回答:


366

私はこのようなものがうまくいくと思います:

System.ServiceProcessプロジェクト参照に追加します([.NET]タブにあります)。

using System.ServiceProcess;

ServiceController sc = new ServiceController(SERVICENAME);

switch (sc.Status)
{
    case ServiceControllerStatus.Running:
        return "Running";
    case ServiceControllerStatus.Stopped:
        return "Stopped";
    case ServiceControllerStatus.Paused:
        return "Paused";
    case ServiceControllerStatus.StopPending:
        return "Stopping";
    case ServiceControllerStatus.StartPending:
        return "Starting";
    default:
        return "Status Changing";
}

編集:sc.WaitforStatus()目的のステータスとタイムアウトを取得するメソッドもありますが、これを使用したことはありませんが、ニーズに合う場合があります。

編集:ステータスを取得したら、再度ステータスを取得するには、sc.Refresh()最初に呼び出す必要があります。

参照:.NETのServiceControllerオブジェクト。


11
ServiceController.GetServices()は、インストールされているすべてのサービスを含む配列をServiceControllerオブジェクトとして取得します。これは非常に役立ちます。
ラリー

9
System.ServiceProcessへの参照を追加し、ステートメントを追加します。using System.ServiceProcess;
NealWalters 2009

6
不正なサービス名を渡した場合、エラーがスローされるのではなく、ロックされたように見えました。私はこのコードを追加しました:catch(System.Exception ex){return "Not found"; }
NealWalters 2009

6
NealWalters:サービスが見つからなかったという理由だけで例外がスローされたことをどうやって知るのですか?キャッチするより適切な例外タイプはありませんか?
Patrik Svensson、2010

3
private static bool ServiceExists(string serviceName){return ServiceController.GetServices()。FirstOrDefault(s => s.ServiceName == serviceName)!= null; }
ドミトリーパブロフ2013

16

ここでは、ローカルマシンで利用可能なすべてのサービスとそのステータスを取得します。

ServiceController[] services = ServiceController.GetServices();
foreach(ServiceController service in services)
{
    Console.WriteLine(service.ServiceName+"=="+ service.Status);
}

ループ内でサービスとservice.nameプロパティを比較すると、サービスのステータスを取得できます。詳細については、http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicecontroller.aspx参照して ください。http://msdn.microsoft.com/en-us/library/microsoft.windows.design .servicemanager(v = vs.90).aspx

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.