Windowsサービスのインストールアンインストールとサービス制御

30004 ワード

この文書には、C#コードでWindows Service(exeファイル、パッケージ化されたインストールファイルではない)をインストールする方法、サービスが存在するかどうかを判断する方法、サービスステータスを取得する方法、およびサービス停止を開始する方法が含まれます.
Windowsサービスプロジェクトを作成し、Buildでexeファイルを取得します.サービスを作成する方法については、Windowsサービスを作成し、インストールファイルにパッケージ化を参照してください.
一、Windowsサービスのインストールとアンインストール
インストールおよびアンインストールサービスは.NETツールinstallutil.exe(eg:インストール->installutil xxx.exeアンインストール->installutil/uxxx.exe)を使用し、ManagedInstallerClassを使用してインストールアンインストールWindowsサービスを実装します.ManagedInstallerClassはSystem.configuration.Installネーミングスペースの下にあります.
次のようになります.
 1         /// <summary>
2 /// Windows Service exe Service
3 /// installutil xxx.exe
4 /// </summary>
5 /// <param name="installFile">exe ( )</param>
6 /// <returns> </returns>
7 public static bool InstallServie(string installFile)
8 {
9 string[] args = { installFile };
10 try
11 {
12 ManagedInstallerClass.InstallHelper(args);
13 return true;
14 }
15 catch
16 {
17 return false;
18 }
19 }
20
21 /// <summary>
22 /// Windows Service exe Service
23 /// installutil /u xxx.exe
24 /// </summary>
25 /// <param name="installFile">exe ( )</param>
26 /// <returns> </returns>
27 public static bool UninstallService(string installFile)
28 {
29 string[] args = { "/u", installFile };
30 try
31 {
32 // , exe
33 string tmp = installFile;
34 if (tmp.IndexOf('\\') != -1)
35 {
36 tmp = tmp.Substring(tmp.LastIndexOf('\\') + 1);
37 }
38 string svcName = tmp.Substring(0, tmp.LastIndexOf('.'));
39 // windows
40 StopService(svcName);
41
42 ManagedInstallerClass.InstallHelper(args);
43 return true;
44 }
45 catch
46 {
47 return false;
48 }
49 }

注意:サービスが削除される前にサービスを停止する必要があります.そうしないと、サービスは無効とマークされ、削除できません.理由:システムがサービスを削除する場合、まずサービスが「削除」とマークされ、サービスのすべての参照が完全に切断されるのを待ってから、サービスが完全に削除されます.サービス参照が完全に切断されていない場合、サービスが削除され、システムはサービスを無効状態にロックし、サービスが完全に削除されていないことに注意して、他の操作が禁止されます.したがって、削除された直後に再インストールされたサービスについては、サービスに関連するすべての参照を完全に解放する必要があります.この場合、システムは本当にサービスを完全に削除してから、サービスを再インストールすることができます.サービス無効化の問題が発生した場合は、コード、サービス参照がある場所を確認し、他のプログラムが参照されているかどうかを確認し、これらの参照プログラムを終了します.
二、Windowsサービスの状態取得と制御
ServiceControllerを使用して、サービスステータスを取得したり、サービスを制御したりします.
ServiceControllerは、Windowsサービスを表し、実行中または停止中のサービスに接続したり、操作したり、情報を取得したりすることができます.ServiceControllerクラスを使用して既存のサービスに接続し、動作を制御します.ServiceControllerクラスのインスタンスを作成する場合は、特定のWindowsサービスと相互作用するようにプロパティを設定します.その後、このようなサービスを開始、停止、および他の方法で操作できます.インスタンスを作成したら、コンピュータ名と制御するサービスの名前の2つのプロパティを設定して、インタラクティブなサービスを識別する必要があります.デフォルトでは、MachineNameはローカルコンピュータに設定されているので、インスタンスを別のコンピュータに設定しない限り、変更する必要はありません.
サービスが処理できるコマンドセットは、そのサービスのプロパティに依存します.たとえば、サービスのCanStopプロパティをfalseに設定できます.この設定は、Stopコマンドをその特定のサービスで使用できないようにする.必要なボタンが無効になっているため、SCMからサービスを停止できません.コードでサービスを停止しようとすると、エラーが発生し、「サービスを停止できませんでした」というエラーメッセージが表示されます.
一般的な操作は次のとおりです.
  1.  サービスに対応するサービスコントローラのインスタンスを取得
 1         /// <summary>
2 /// service ServiceController
3 /// </summary>
4 /// <param name="serviceName"> </param>
5 /// <returns>ServiceController , , null</returns>
6 public static ServiceController GetService(string serviceName)
7 {
8 ServiceController[] services = ServiceController.GetServices();
9 foreach (ServiceController s in services)
10 {
11 if (s.ServiceName == serviceName)
12 {
13 return s;
14 }
15 }
16 return null;
17 }

  2.  指定したサービスが存在するかどうかを確認します.
 1         /// <summary>  
2 ///
3 /// </summary>
4 /// <param name="serviceName"> </param>
5 /// <returns> </returns>
6 public static bool ServiceExisted(string serviceName)
7 {
8 if (GetService(serviceName) == null)
9 {
10 return false;
11 }
12 else
13 {
14 return true;
15 }
16 }

3.サービス詳細の取得
 1         /// <summary>
2 /// Service
3 /// </summary>
4 /// <param name="serviceName"> </param>
5 /// <returns>Service , string </returns>
6 public static string GetServiceInfo(string serviceName)
7 {
8 StringBuilder details = new StringBuilder();
9
10 ServiceController sc = GetService(serviceName);
11
12 if (sc == null)
13 {
14 return string.Format("{0} !", serviceName);
15 }
16
17 details.AppendLine(string.Format(" : {0}", sc.ServiceName));
18 details.AppendLine(string.Format(" :{0}", sc.DisplayName));
19 details.AppendLine(string.Format(" : {0}", sc.CanStop));
20 details.AppendLine(string.Format(" : {0}", sc.MachineName)); // "."
21 details.AppendLine(string.Format(" : {0}", sc.ServiceType.ToString()));
22 details.AppendLine(string.Format(" : {0}", sc.Status.ToString()));
23
24 // DependentServices ServiceController 。
25 StringBuilder dependentServices = new StringBuilder();
26 foreach (ServiceController s in sc.DependentServices)
27 {
28 dependentServices.Append(s.ServiceName + ", ");
29 }
30 details.AppendLine(string.Format(" ServiceController : {0}", dependentServices.ToString()));
31
32 // ServicesDependedOn 。
33 StringBuilder serviceDependedOn = new StringBuilder();
34 foreach (ServiceController s in sc.ServicesDependedOn)
35 {
36 serviceDependedOn.Append(s.ServiceName + ", ");
37 }
38 details.AppendLine(string.Format(" : {0}", serviceDependedOn.ToString()));
39
40 return details.ToString();
41 }

  4.  サービスの開始
 1         /// <summary>
2 ///
3 /// </summary>
4 /// <param name="serviceName"> </param>
5 /// <returns> </returns>
6 public static bool StartService(string serviceName)
7 {
8 ServiceController sc = GetService(serviceName);
9
10 if (sc.Status != ServiceControllerStatus.Running)
11 {
12 try
13 {
14 sc.Start();
15 sc.WaitForStatus(ServiceControllerStatus.Running); //
16 }
17 catch
18 {
19 return false;
20 }
21 }
22
23 return true;
24 }

  5.  サービスの停止
 1         /// <summary>
2 ///
3 /// </summary>
4 /// <param name="serviceName"> </param>
5 /// <returns> , , </returns>
6 public static bool StopService(string serviceName)
7 {
8 ServiceController sc = GetService(serviceName);
9
10 if (!sc.CanStop)
11 {
12 throw new Exception(string.Format(" {0} .", serviceName));
13 }
14
15 if (sc.Status != ServiceControllerStatus.Stopped)
16 {
17 try
18 {
19 sc.Stop();
20 sc.WaitForStatus(ServiceControllerStatus.Stopped); //
21 }
22 catch
23 {
24 return false;
25 }
26 }
27
28 return true;
29 }