C#

C# サービスを開始、停止、再起動する

Windowsでは、「サービス」と呼ばれるプログラムが動いています。
この「サービス」は、ユーザーの見えないところでいろいろ裏方のお仕事をしてくれているのですが
普段は使わないサービスを止めて置いたり、必要な時にだけ自分で起動したりすることがあります。

そこで、今回はサービスの操作を行ってみたいと思います。

「サービス」の操作は、管理者に昇格して行うようにしてください。

 

サービスの操作

プログラムからできるサービスの操作には

  • サービスの起動(Start)
  • サービスの停止(Stop)
  • サービスの一時停止(Pause)
  • サービスの再起動(Continue)

があります。

サービスを操作するプログラムには、参照に”System.ServiceProcess”を追加し、操作したいサービスのSystem.ServiceProcess.ServiceControllerクラスのオブジェクトを生成して、操作を行います。

また、サービスにはいろいろな種類があり、ユーザーや外部のプログラムから操作できるものと操作できないものがあります。
できない操作を行おうとするとInvalidOperationException例外が発生します。

操作できるかどうかをチェックするためのプロパティが用意されています。
CanStopプロパティ
サービスの停止操作ができるかどうか、停止操作ができる場合はtrue、できない場合はfalseです。
OSなどシステムの内部に関連するサービスは停止操作はできないものが多いです。

CanPauseAndContinueプロパティ
サービスの一時停止、再起動(再開)ができるかどうか、一時停止、再起動(再開)ができる場合はtrue、できない場合はfalseとなります。

 

サービスを操作するプログラムを作ってみる

サービスを操作する処理の前後にSystem.ServiceProcess.ServiceControllerStatusで状態を確認したり
System.ServiceProcess.ServiceController.WaitForStatus()で状態が変わるのを待つという処理があります。
これらは、操作したあとにサービスとの連携などを行う場合に、正しく連携ができるようにするためです。

サンプルプログラムは下記のようになります。

(サンプルプログラムで出てくるサービス名”TapiSrv”は、サービスで表示されている名称では”Telephony”というサービスです)

 

static void Test2(string[] args)
{
    try
    {
        string name;
        string machine_name;
        name = "TapiSrv";
        machine_name = ".";
        System.ServiceProcess.ServiceController sc = new System.ServiceProcess.ServiceController(name, machine_name);
        System.ServiceProcess.ServiceControllerStatus stat = sc.Status;
        Console.WriteLine(string.Format("Service=\"{0}\" Current Stat={1}", name, stat.ToString()));
        switch (stat)
        {
            case System.ServiceProcess.ServiceControllerStatus.Stopped:
                // サービスが停止している場合
                sc.Start();
                // 指定した状態になるのを待つ
                sc.WaitForStatus(System.ServiceProcess.ServiceControllerStatus.Running);
                Console.WriteLine(string.Format("Service=\"{0}\" Changed Stat={1}", name, sc.Status.ToString()));
                break;
            case System.ServiceProcess.ServiceControllerStatus.Running:
                if(sc.CanStop)
                {
                    sc.Stop();
                    // 指定した状態になるのを待つ
                    sc.WaitForStatus(System.ServiceProcess.ServiceControllerStatus.Stopped);
                    Console.WriteLine(string.Format("Service=\"{0}\" Changed Stat={1}", name, sc.Status.ToString()));
                }
                else if (sc.CanPauseAndContinue)
                {
                    // 一時中断、再開できる場合
                    sc.Pause();
                    // 指定した状態になるのを待つ
                    sc.WaitForStatus(System.ServiceProcess.ServiceControllerStatus.Paused);
                    Console.WriteLine(string.Format("Service=\"{0}\" Changed Stat={1}", name, sc.Status.ToString()));
                }
                break;
            case System.ServiceProcess.ServiceControllerStatus.Paused:
                // 一時中断状態の場合
                if (sc.CanPauseAndContinue)
                {
                    // 一時中断、再開できる場合
                    sc.Continue();
                    // 指定した状態になるのを待つ
                    sc.WaitForStatus(System.ServiceProcess.ServiceControllerStatus.Running);
                    Console.WriteLine(string.Format("Service=\"{0}\" Changed Stat={1}", name, sc.Status.ToString()));
                }
                break;
            default:
                break;
        }
    }
    catch (InvalidOperationException ex)
    {
        Console.WriteLine(ex.Message);
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}

 

タイトルとURLをコピーしました