DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

サービスの情報を取得する

ServiceControllerクラスのインスタンスを作成し、プロパティを調べることにより、そのサービスの名前、表示名、種類、ステータス、サービスが依存しているサービス、サービスに依存しているサービスなどの情報を取得することができます。なお、ServiceControllerクラスはNT系OSでのみ使用できます。

以下の例では、ローカルコンピュータ(".")のサービス"IIS Admin Service"の情報を表示しています。

VB.NET
コードを隠すコードを選択
'参照設定にSystem.ServiceProcess.dllが追加されているものとする

'ServiceControllerオブジェクトの作成
Dim sc As New System.ServiceProcess.ServiceController( _
    "IIS Admin Service", ".")

'サービスに関する情報を取得し、表示する
Console.WriteLine("サービス名:{0}", sc.ServiceName)
Console.WriteLine("表示名:{0}", sc.DisplayName)
Console.WriteLine("コンピュータ名:{0}", sc.MachineName)

Console.WriteLine("種類:{0}", sc.ServiceType)
Console.WriteLine("ステータス:{0}", sc.Status)

Console.WriteLine("一時中断、再開できるか:{0}", sc.CanPauseAndContinue)
Console.WriteLine("シャットダウン時に通知の必要があるか:{0}", _
    sc.CanShutdown)
Console.WriteLine("停止できるか:{0}", sc.CanStop)

'サービスが依存しているサービス一覧を表示
Console.WriteLine("{0}が依存しているサービス", sc.DisplayName)
Dim sdos As System.ServiceProcess.ServiceController() = _
    sc.ServicesDependedOn
Dim sdo As System.ServiceProcess.ServiceController
For Each sdo In sdos
    Console.WriteLine(ControlChars.Tab + "{0}", sdo.DisplayName)
Next sdo

'サービスに依存しているサービス一覧を表示
Console.WriteLine("{0}に依存しているサービス", sc.DisplayName)
Dim dss As System.ServiceProcess.ServiceController() = sc.DependentServices
Dim ds As System.ServiceProcess.ServiceController
For Each ds In dss
    Console.WriteLine(ControlChars.Tab + "{0}", ds.DisplayName)
Next ds
C#
コードを隠すコードを選択
//参照設定にSystem.ServiceProcess.dllが追加されているものとする

//ServiceControllerオブジェクトの作成
System.ServiceProcess.ServiceController sc =
    new System.ServiceProcess.ServiceController(
        "IIS Admin Service", ".");

//サービスに関する情報を取得し、表示する
Console.WriteLine("サービス名:{0}", sc.ServiceName);
Console.WriteLine("表示名:{0}", sc.DisplayName);
Console.WriteLine("コンピュータ名:{0}", sc.MachineName);

Console.WriteLine("種類:{0}", sc.ServiceType);
Console.WriteLine("ステータス:{0}", sc.Status);

Console.WriteLine("一時中断、再開できるか:{0}",
    sc.CanPauseAndContinue);
Console.WriteLine("シャットダウン時に通知の必要があるか:{0}",
    sc.CanShutdown);
Console.WriteLine("停止できるか:{0}", sc.CanStop);

//サービスが依存しているサービス一覧を表示
Console.WriteLine("{0}が依存しているサービス", sc.DisplayName);
System.ServiceProcess.ServiceController[] sdos = sc.ServicesDependedOn;
foreach (System.ServiceProcess.ServiceController sdo in sdos)
    Console.WriteLine("\t{0}", sdo.DisplayName);

//サービスに依存しているサービス一覧を表示
Console.WriteLine("{0}に依存しているサービス", sc.DisplayName);
System.ServiceProcess.ServiceController[] dss = sc.DependentServices;
foreach (System.ServiceProcess.ServiceController ds in dss)
    Console.WriteLine("\t{0}", ds.DisplayName);

サービスを開始、停止、一時中断、再開する

サービスを開始、停止、一時中断、再開するには、それぞれStart、Stop、Pause、Continueメソッドを呼び出します。またWaitForStatusメソッドを使うことにより、サービスが指定した状態になるまで待機することもできます。

Windows Vista以降でUACが有効になっている時は、管理者に昇格しないと例外InvalidOperationExceptionをスローして失敗するかもしれません。対処法については「Vista以降でUACが有効だとファイルの作成等に失敗する問題の対処法」をご覧ください。

VB.NET
コードを隠すコードを選択
'参照設定にSystem.ServiceProcess.dllが追加されているものとする

'ServiceControllerオブジェクトの作成
Dim sc As New System.ServiceProcess.ServiceController("Telnet", ".")

If sc.Status = System.ServiceProcess.ServiceControllerStatus.Stopped Then
    'サービスが停止していれば、開始する
    sc.Start()
    'サービスが開始されるまで待機する
    sc.WaitForStatus(System.ServiceProcess.ServiceControllerStatus.Running)
'キャンセルできるか調べる
ElseIf sc.CanStop Then
    'サービスを停止する
    sc.Stop()
    'サービスが停止するまで待機する
    sc.WaitForStatus(System.ServiceProcess.ServiceControllerStatus.Stopped)
'一時中断、再開できるか調べる
ElseIf sc.CanPauseAndContinue Then
    If sc.Status = System.ServiceProcess.ServiceControllerStatus.Paused Then
        '一時中断状態の時は続行する
        sc.Continue()
        'サービスが開始されるまで待機する
        sc.WaitForStatus(System.ServiceProcess.ServiceControllerStatus.Running)
    Else
        'サービスを中断する
        sc.Pause()
        'サービスが中断されるまで待機する
        sc.WaitForStatus(System.ServiceProcess.ServiceControllerStatus.Paused)
    End If
End If
C#
コードを隠すコードを選択
//参照設定にSystem.ServiceProcess.dllが追加されているものとする

//ServiceControllerオブジェクトの作成
System.ServiceProcess.ServiceController sc =
    new System.ServiceProcess.ServiceController("Telnet", ".");

if (sc.Status == System.ServiceProcess.ServiceControllerStatus.Stopped)
{
    //サービスが停止していれば、開始する
    sc.Start();
    //サービスが開始されるまで待機する
    sc.WaitForStatus(System.ServiceProcess.ServiceControllerStatus.Running);
}
//キャンセルできるか調べる
else if (sc.CanStop)
{
    //サービスを停止する
    sc.Stop();
    //サービスが停止するまで待機する
    sc.WaitForStatus(System.ServiceProcess.ServiceControllerStatus.Stopped);
}
//一時中断、再開できるか調べる
else if (sc.CanPauseAndContinue)
{
    if (sc.Status == System.ServiceProcess.ServiceControllerStatus.Paused)
    {
        //一時中断状態の時は続行する
        sc.Continue();
        //サービスが開始されるまで待機する
        sc.WaitForStatus(System.ServiceProcess.ServiceControllerStatus.Running);
    }
    else
    {
        //サービスを中断する
        sc.Pause();
        //サービスが中断されるまで待機する
        sc.WaitForStatus(System.ServiceProcess.ServiceControllerStatus.Paused);
    }
}
  • 履歴:
  • 2011/12/10 サンプルを書き換え。UACに関する記述を追加。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • 「???を参照に追加します」の意味が分からないという方は、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。