[C#] ServiceControllerを使用したサービス一覧の取得方法
C#でServiceControllerクラス
を使用してサービス一覧を取得する方法は、ServiceController.GetServices()メソッド
を利用します。
このメソッドは、ローカルコンピュータ上で実行中のすべてのサービスを取得し、ServiceController
オブジェクトの配列を返します。
各ServiceController
オブジェクトには、サービスの名前、表示名、ステータスなどの情報が含まれています。
これにより、特定のサービスの状態を確認したり、サービスを開始・停止する操作を行うことができます。
ServiceControllerクラス
はSystem.ServiceProcess
名前空間に属しているため、使用する際はこの名前空間をインポートする必要があります。
サービス一覧の取得方法
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' が停止しています。
このコードでは、サービスが停止している場合にアラートメッセージをコンソールに表示します。
実際のアプリケーションでは、メール送信やログ記録などの処理を追加することができます。
まとめ
この記事では、C#のServiceControllerクラス
を使用してWindowsサービスの一覧を取得し、詳細情報を取得する方法や、サービスの操作方法について詳しく解説しました。
また、リモートコンピュータのサービスを操作する方法や、サービスの異常検知とアラートの実装例も紹介しました。
これらの知識を活用することで、サービス管理の効率を向上させることができるでしょう。
ぜひ、実際のプロジェクトにこれらの技術を取り入れて、サービスの管理や監視を自動化してみてください。