[C#] ServiceControllerを使用したサービス一覧の取得方法

C#でServiceControllerクラスを使用してサービス一覧を取得する方法は、ServiceController.GetServices()メソッドを利用します。

このメソッドは、ローカルコンピュータ上で実行中のすべてのサービスを取得し、ServiceControllerオブジェクトの配列を返します。

ServiceControllerオブジェクトには、サービスの名前、表示名、ステータスなどの情報が含まれています。

これにより、特定のサービスの状態を確認したり、サービスを開始・停止する操作を行うことができます。

ServiceControllerクラスSystem.ServiceProcess名前空間に属しているため、使用する際はこの名前空間をインポートする必要があります。

この記事でわかること
  • C#でサービス一覧を取得する方法
  • サービスの詳細情報を取得する手法
  • サービスの操作方法と注意点
  • リモートサービスの管理方法
  • 異常検知とアラートの実装方法

目次から探す

サービス一覧の取得方法

C#のServiceControllerクラスを使用すると、Windowsサービスの情報を簡単に取得できます。

ここでは、サービス一覧を取得する方法について詳しく解説します。

GetServicesメソッドの使用

ServiceControllerクラスには、システム上のすべてのサービスを取得するためのGetServicesメソッドがあります。

このメソッドを使用することで、サービスの一覧を簡単に取得できます。

以下は、GetServicesメソッドを使用してサービス一覧を取得するサンプルコードです。

using System;
using System.ServiceProcess;
class Program
{
    static void Main()
    {
        // サービスの一覧を取得
        ServiceController[] services = ServiceController.GetServices();
        // 各サービスの情報を表示
        foreach (ServiceController service in services)
        {
            Console.WriteLine($"サービス名: {service.ServiceName}, 表示名: {service.DisplayName}");
        }
    }
}
サービス名: wuauserv, 表示名: Windows Update
サービス名: bits, 表示名: Background Intelligent Transfer Service
...

このコードでは、GetServicesメソッドを使用してすべてのサービスを取得し、各サービスの名前と表示名をコンソールに出力しています。

サービス情報の取得

サービスの詳細情報を取得するためには、ServiceControllerクラスのプロパティを利用します。

以下のプロパティを使用することで、サービスの状態や説明などの情報を取得できます。

スクロールできます
プロパティ名説明
ServiceNameサービスの内部名
DisplayNameサービスの表示名
Statusサービスの現在の状態(例: Running, Stopped)
CanStopサービスが停止可能かどうか

以下は、サービスの詳細情報を取得するサンプルコードです。

using System;
using System.ServiceProcess;
class Program
{
    static void Main()
    {
        // サービスの一覧を取得
        ServiceController[] services = ServiceController.GetServices();
        // 各サービスの詳細情報を表示
        foreach (ServiceController service in services)
        {
            Console.WriteLine($"サービス名: {service.ServiceName}");
            Console.WriteLine($"表示名: {service.DisplayName}");
            Console.WriteLine($"状態: {service.Status}");
            Console.WriteLine($"停止可能: {service.CanStop}");
            Console.WriteLine();
        }
    }
}
サービス名: wuauserv
表示名: Windows Update
状態: Running
停止可能: True
サービス名: bits
表示名: Background Intelligent Transfer Service
状態: Stopped
停止可能: True
...

このコードでは、各サービスの詳細情報をコンソールに出力しています。

サービスのフィルタリング

特定の条件に基づいてサービスをフィルタリングすることも可能です。

たとえば、実行中のサービスのみを表示することができます。

以下は、実行中のサービスのみをフィルタリングして表示するサンプルコードです。

using System;
using System.ServiceProcess;
class Program
{
    static void Main()
    {
        // サービスの一覧を取得
        ServiceController[] services = ServiceController.GetServices();
        // 実行中のサービスのみを表示
        foreach (ServiceController service in services)
        {
            if (service.Status == ServiceControllerStatus.Running)
            {
                Console.WriteLine($"サービス名: {service.ServiceName}, 表示名: {service.DisplayName}");
            }
        }
    }
}
サービス名: wuauserv, 表示名: Windows Update
サービス名: bits, 表示名: Background Intelligent Transfer Service
...

このコードでは、if文を使用して、実行中のサービスのみをフィルタリングして表示しています。

サービスの詳細情報の取得

Windowsサービスの詳細情報を取得することは、サービスの管理やトラブルシューティングにおいて非常に重要です。

ここでは、サービス名、表示名、ステータス、説明、パスなどの情報を取得する方法について解説します。

サービス名と表示名の取得

サービス名と表示名は、サービスを識別するための重要な情報です。

ServiceControllerクラスを使用して、これらの情報を簡単に取得できます。

以下は、サービス名と表示名を取得するサンプルコードです。

using System;
using System.ServiceProcess;
class Program
{
    static void Main()
    {
        // サービスの一覧を取得
        ServiceController[] services = ServiceController.GetServices();
        // 各サービスのサービス名と表示名を表示
        foreach (ServiceController service in services)
        {
            Console.WriteLine($"サービス名: {service.ServiceName}, 表示名: {service.DisplayName}");
        }
    }
}
サービス名: wuauserv, 表示名: Windows Update
サービス名: bits, 表示名: Background Intelligent Transfer Service
...

このコードでは、すべてのサービスのサービス名と表示名をコンソールに出力しています。

サービスのステータス確認

サービスのステータスを確認することは、サービスが正常に動作しているかどうかを判断するために重要です。

ServiceControllerクラスStatusプロパティを使用して、サービスの現在の状態を取得できます。

以下は、サービスのステータスを確認するサンプルコードです。

using System;
using System.ServiceProcess;
class Program
{
    static void Main()
    {
        // サービスの一覧を取得
        ServiceController[] services = ServiceController.GetServices();
        // 各サービスのステータスを表示
        foreach (ServiceController service in services)
        {
            Console.WriteLine($"サービス名: {service.ServiceName}, ステータス: {service.Status}");
        }
    }
}
サービス名: wuauserv, ステータス: Running
サービス名: bits, ステータス: Stopped
...

このコードでは、各サービスのサービス名とそのステータスをコンソールに出力しています。

サービスの説明とパスの取得

サービスの説明や実行ファイルのパスを取得することも、サービスの管理において重要です。

これらの情報は、ServiceControllerクラスでは直接取得できませんが、ManagementObjectクラスを使用することで取得できます。

以下は、サービスの説明と実行ファイルのパスを取得するサンプルコードです。

using System;
using System.Management;
class Program
{
    static void Main()
    {
        // WMIクエリを使用してサービス情報を取得
        ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_Service");
        foreach (ManagementObject service in searcher.Get())
        {
            Console.WriteLine($"サービス名: {service["Name"]},");
            Console.WriteLine($"表示名: {service["DisplayName"]},");
            Console.WriteLine($"説明: {service["Description"]},");
            Console.WriteLine($"実行ファイルのパス: {service["PathName"]}");
            Console.WriteLine();
        }
    }
}
サービス名: wuauserv,
表示名: Windows Update,
説明: Windows Updateサービスは、Windowsの更新プログラムをダウンロードしてインストールします,
実行ファイルのパス: "C:\Windows\system32\svchost.exe -k LocalSystem"
サービス名: bits,
表示名: Background Intelligent Transfer Service,
説明: BITSは、バックグラウンドでファイルを転送するためのサービスです,
実行ファイルのパス: "C:\Windows\system32\svchost.exe -k BITS"
...

このコードでは、WMIを使用してサービスの詳細情報を取得し、サービス名、表示名、説明、実行ファイルのパスをコンソールに出力しています。

サービスの操作

C#のServiceControllerクラスを使用すると、Windowsサービスの操作をプログラムから簡単に行うことができます。

ここでは、サービスの開始、停止、再起動、そしてステータス変更の監視について解説します。

サービスの開始と停止

サービスを開始または停止するには、ServiceControllerクラスStartメソッドStopメソッドを使用します。

これにより、指定したサービスの状態を変更できます。

以下は、サービスを開始および停止するサンプルコードです。

using System;
using System.ServiceProcess;
class Program
{
    static void Main()
    {
        // 操作するサービス名を指定
        string serviceName = "wuauserv"; // Windows Updateサービス
        // ServiceControllerオブジェクトを作成
        ServiceController service = new ServiceController(serviceName);
        // サービスの現在の状態を表示
        Console.WriteLine($"現在のステータス: {service.Status}");
        // サービスを開始
        if (service.Status == ServiceControllerStatus.Stopped)
        {
            service.Start();
            service.WaitForStatus(ServiceControllerStatus.Running);
            Console.WriteLine("サービスを開始しました。");
        }
        // サービスを停止
        if (service.Status == ServiceControllerStatus.Running)
        {
            service.Stop();
            service.WaitForStatus(ServiceControllerStatus.Stopped);
            Console.WriteLine("サービスを停止しました。");
        }
    }
}
現在のステータス: Stopped
サービスを開始しました。
サービスを停止しました。

このコードでは、指定したサービスの現在の状態を確認し、サービスが停止している場合は開始し、実行中の場合は停止します。

サービスの再起動

サービスを再起動するには、まずサービスを停止し、その後再度開始する必要があります。

以下は、サービスを再起動するサンプルコードです。

using System;
using System.ServiceProcess;
class Program
{
    static void Main()
    {
        // 操作するサービス名を指定
        string serviceName = "wuauserv"; // Windows Updateサービス
        // ServiceControllerオブジェクトを作成
        ServiceController service = new ServiceController(serviceName);
        // サービスを再起動
        if (service.Status == ServiceControllerStatus.Running)
        {
            service.Stop();
            service.WaitForStatus(ServiceControllerStatus.Stopped);
            Console.WriteLine("サービスを停止しました。");
        }
        service.Start();
        service.WaitForStatus(ServiceControllerStatus.Running);
        Console.WriteLine("サービスを再起動しました。");
    }
}
サービスを停止しました。
サービスを再起動しました。

このコードでは、サービスが実行中であれば停止し、その後再度開始することで再起動を実現しています。

サービスのステータス変更の監視

サービスのステータスを監視するには、定期的にサービスの状態をチェックする必要があります。

以下は、サービスのステータスを監視するサンプルコードです。

using System;
using System.ServiceProcess;
using System.Threading;
class Program
{
    static void Main()
    {
        // 操作するサービス名を指定
        string serviceName = "wuauserv"; // Windows Updateサービス
        // ServiceControllerオブジェクトを作成
        ServiceController service = new ServiceController(serviceName);
        // ステータス監視ループ
        while (true)
        {
            Console.WriteLine($"現在のステータス: {service.Status}");
            Thread.Sleep(5000); // 5秒待機
            // サービスの状態を再取得
            service.Refresh();
        }
    }
}
現在のステータス: Running
現在のステータス: Running
現在のステータス: Stopped
...

このコードでは、無限ループを使用してサービスの状態を5秒ごとにチェックし、現在のステータスをコンソールに出力しています。

サービスの状態が変わった場合には、適切な処理を追加することができます。

応用例

C#のServiceControllerクラスを使用することで、さまざまな応用が可能です。

ここでは、リモートコンピュータのサービス一覧取得、サービスの自動化スクリプトの作成、サービスの異常検知とアラートについて解説します。

リモートコンピュータのサービス一覧取得

リモートコンピュータのサービス一覧を取得するには、ServiceControllerクラスのコンストラクタにリモートホスト名を指定します。

これにより、指定したリモートコンピュータ上のサービス情報を取得できます。

以下は、リモートコンピュータのサービス一覧を取得するサンプルコードです。

using System;
using System.ServiceProcess;
class Program
{
    static void Main()
    {
        // リモートコンピュータのホスト名を指定
        string remoteMachineName = "REMOTE_COMPUTER_NAME"; // リモートコンピュータ名
        // リモートコンピュータのサービス一覧を取得
        ServiceController[] services = ServiceController.GetServices(remoteMachineName);
        // 各サービスの情報を表示
        foreach (ServiceController service in services)
        {
            Console.WriteLine($"サービス名: {service.ServiceName}, 表示名: {service.DisplayName}");
        }
    }
}
サービス名: wuauserv, 表示名: Windows Update
サービス名: bits, 表示名: Background Intelligent Transfer Service
...

このコードでは、指定したリモートコンピュータのサービス一覧を取得し、各サービスの名前と表示名をコンソールに出力しています。

サービスの自動化スクリプトの作成

特定のサービスを定期的に監視し、自動的に開始または停止するスクリプトを作成することができます。

これにより、サービスの管理を効率化できます。

以下は、サービスの自動化スクリプトのサンプルコードです。

using System;
using System.ServiceProcess;
using System.Threading;
class Program
{
    static void Main()
    {
        // 操作するサービス名を指定
        string serviceName = "wuauserv"; // Windows Updateサービス
        // ServiceControllerオブジェクトを作成
        ServiceController service = new ServiceController(serviceName);
        // スクリプトのループ
        while (true)
        {
            // サービスが停止している場合は開始
            if (service.Status == ServiceControllerStatus.Stopped)
            {
                service.Start();
                service.WaitForStatus(ServiceControllerStatus.Running);
                Console.WriteLine("サービスを開始しました。");
            }
            // サービスが実行中の場合は、5分ごとに状態を確認
            Thread.Sleep(300000); // 5分待機
            service.Refresh();
        }
    }
}

このコードでは、指定したサービスが停止している場合に自動的に開始し、5分ごとに状態を確認します。

サービスの異常検知とアラート

サービスの異常を検知し、アラートを出すことも可能です。

たとえば、サービスが停止した場合にメール通知を送信するなどの処理を追加できます。

以下は、サービスの異常を検知し、コンソールにアラートを表示するサンプルコードです。

using System;
using System.ServiceProcess;
using System.Threading;
class Program
{
    static void Main()
    {
        // 操作するサービス名を指定
        string serviceName = "wuauserv"; // Windows Updateサービス
        // ServiceControllerオブジェクトを作成
        ServiceController service = new ServiceController(serviceName);
        // 異常検知ループ
        while (true)
        {
            // サービスが停止している場合はアラートを表示
            if (service.Status == ServiceControllerStatus.Stopped)
            {
                Console.WriteLine($"アラート: サービス '{serviceName}' が停止しています。");
            }
            // 5秒ごとに状態を確認
            Thread.Sleep(5000);
            service.Refresh();
        }
    }
}
アラート: サービス 'wuauserv' が停止しています。

このコードでは、サービスが停止している場合にアラートメッセージをコンソールに表示します。

実際のアプリケーションでは、メール送信やログ記録などの処理を追加することができます。

よくある質問

ServiceControllerを使用する際の注意点は?

ServiceControllerクラスを使用する際には、以下の点に注意が必要です。

  • 権限: サービスの操作には管理者権限が必要です。

権限が不足していると、サービスの開始や停止ができない場合があります。

  • サービス名の正確性: サービス名は正確に指定する必要があります。

誤ったサービス名を指定すると、InvalidOperationExceptionが発生します。

  • サービスの状態確認: サービスの状態を確認する際は、Refreshメソッドを使用して最新の状態を取得することが重要です。

キャッシュされた情報では正確な状態がわからないことがあります。

サービスが見つからない場合の対処法は?

サービスが見つからない場合、以下の対処法を試みることができます。

  • サービス名の確認: 指定したサービス名が正しいかどうかを確認します。

Windowsの「サービス」管理ツールでサービス名を確認できます。

  • サービスのインストール状況: サービスがインストールされているかどうかを確認します。

インストールされていないサービスを指定すると、見つからないエラーが発生します。

  • 権限の確認: サービスにアクセスするための権限があるか確認します。

管理者権限で実行しているかどうかをチェックします。

リモートサービスの操作は可能ですか?

はい、ServiceControllerクラスを使用してリモートコンピュータのサービスを操作することが可能です。

ただし、以下の点に注意が必要です。

  • リモートコンピュータの名前: リモートコンピュータのホスト名またはIPアドレスを正しく指定する必要があります。
  • ネットワーク接続: リモートコンピュータに対してネットワーク接続が確立されていることを確認します。
  • 権限と設定: リモートサービスを操作するには、リモートコンピュータ上で適切な権限が必要です。

また、リモートサービスの操作が許可されている設定であることを確認します。

ファイアウォールやセキュリティ設定が影響する場合があります。

まとめ

この記事では、C#のServiceControllerクラスを使用してWindowsサービスの一覧を取得し、詳細情報を取得する方法や、サービスの操作方法について詳しく解説しました。

また、リモートコンピュータのサービスを操作する方法や、サービスの異常検知とアラートの実装例も紹介しました。

これらの知識を活用することで、サービス管理の効率を向上させることができるでしょう。

ぜひ、実際のプロジェクトにこれらの技術を取り入れて、サービスの管理や監視を自動化してみてください。

  • URLをコピーしました!
目次から探す