程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#版Windows服務安裝卸載小工具-附源碼

C#版Windows服務安裝卸載小工具-附源碼

編輯:C#入門知識

C#版Windows服務安裝卸載小工具-附源碼


在我們的工作中,經常遇到Windows服務的安裝和卸載,在之前公司也普寫過一個WinForm程序選擇安裝路徑,這次再來個小巧靈活的控制台程序,不用再選擇,只需放到需要安裝服務的目錄中運行就可以實現安裝或卸載。   開發思路 1、由於系統的權限限制,在運行程序時需要以管理員身份運行   2、因為需要實現安裝和卸載兩個功能,在程序運行時提示本次操作是安裝還是卸載  需要輸入 1 或 2   3、接下來程序會查找當前目錄中的可執行文件並過濾程序本身和有時我們復制進來的帶有vhost的文件,並列出列表讓操作者選擇(一般情況下只有一個)   4、根據用戶所選進行安裝或卸載操作   5、由於可能重復操作,需要遞歸調用一下   具體實現 首先們要操作服務,需要用  System.ServiceProcess 來封裝實現類        
 1 using System;
  2 using System.Collections;
  3 using System.Configuration.Install;
  4 using System.Linq;
  5 using System.ServiceProcess;
  6 
  7 namespace AutoInstallUtil
  8 {
  9     public class SystemServices
 10     {
 11         /// <summary>
 12         /// 打開系統服務
 13         /// </summary>
 14         /// <param name="serviceName">系統服務名稱</param>
 15         /// <returns></returns>
 16         public static bool SystemServiceOpen(string serviceName)
 17         {
 18             try
 19             {
 20                 using (var control = new ServiceController(serviceName))
 21                 {
 22                     if (control.Status != ServiceControllerStatus.Running)
 23                     {
 24                         control.Start();
 25                     }
 26                 }
 27                 return true;
 28             }
 29             catch
 30             {
 31                 return false;
 32             }
 33         }
 34 
 35 
 36         /// <summary>
 37         /// 關閉系統服務
 38         /// </summary>
 39         /// <param name="serviceName">系統服務名稱</param>
 40         /// <returns></returns>
 41         public static bool SystemServiceClose(string serviceName)
 42         {
 43             try
 44             {
 45                 using (var control = new ServiceController(serviceName))
 46                 {
 47 
 48                     if (control.Status == ServiceControllerStatus.Running)
 49                     {
 50                         control.Stop();
 51                     }
 52                 }
 53                 return true;
 54             }
 55             catch
 56             {
 57                 return false;
 58             }
 59         }
 60 
 61         /// <summary>
 62         /// 重啟系統服務
 63         /// </summary>
 64         /// <param name="serviceName">系統服務名稱</param>
 65         /// <returns></returns>
 66         public static bool SystemServiceReStart(string serviceName)
 67         {
 68             try
 69             {
 70                 using (var control = new ServiceController(serviceName))
 71                 {
 72                     if (control.Status == System.ServiceProcess.ServiceControllerStatus.Running)
 73                     {
 74                         control.Continue();
 75                     }
 76                 }
 77                 return true;
 78             }
 79             catch
 80             {
 81                 return false;
 82             }
 83         }
 84 
 85         /// <summary>
 86         /// 返回服務狀態
 87         /// </summary>
 88         /// <param name="serviceName">系統服務名稱</param>
 89         /// <returns>1:服務未運行  2:服務正在啟動  3:服務正在停止  4:服務正在運行  5:服務即將繼續  6:服務即將暫停  7:服務已暫停  0:未知狀態</returns>
 90         public static int GetSystemServiceStatus(string serviceName)
 91         {
 92             try
 93             {
 94                 using (var control = new ServiceController(serviceName))
 95                 {
 96                     return (int)control.Status;
 97                 }
 98             }
 99             catch
100             {
101                 return 0;
102             }
103         }
104 
105         /// <summary>
106         /// 返回服務狀態
107         /// </summary>
108         /// <param name="serviceName">系統服務名稱</param>
109         /// <returns>1:服務未運行  2:服務正在啟動  3:服務正在停止  4:服務正在運行  5:服務即將繼續  6:服務即將暫停  7:服務已暫停  0:未知狀態</returns>
110         public static string GetSystemServiceStatusString(string serviceName)
111         {
112             try
113             {
114                 using (var control = new ServiceController(serviceName))
115                 {
116                     var status = string.Empty;
117                     switch ((int)control.Status)
118                     {
119                         case 1:
120                             status = "服務未運行";
121                             break;
122                         case 2:
123                             status = "服務正在啟動";
124                             break;
125                         case 3:
126                             status = "服務正在停止";
127                             break;
128                         case 4:
129                             status = "服務正在運行";
130                             break;
131                         case 5:
132                             status = "服務即將繼續";
133                             break;
134                         case 6:
135                             status = "服務即將暫停";
136                             break;
137                         case 7:
138                             status = "服務已暫停";
139                             break;
140                         case 0:
141                             status = "未知狀態";
142                             break;
143                     }
144                     return status;
145                 }
146             }
147             catch
148             {
149                 return "未知狀態";
150             }
151         }
152 
153         /// <summary>
154         /// 安裝服務
155         /// </summary>
156         /// <param name="stateSaver"></param>
157         /// <param name="filepath"></param>
158         public static void InstallService(IDictionary stateSaver, string filepath)
159         {
160             try
161             {
162                 var myAssemblyInstaller = new AssemblyInstaller
163                 {
164                     UseNewContext = true,
165                     Path = filepath
166                 };
167                 myAssemblyInstaller.Install(stateSaver);
168                 myAssemblyInstaller.Commit(stateSaver);
169                 myAssemblyInstaller.Dispose();
170             }
171             catch (Exception ex)
172             {
173                 throw new Exception("installServiceError/n" + ex.Message);
174             }
175         }
176 
177         public static bool ServiceIsExisted(string serviceName)
178         {
179             ServiceController[] services = ServiceController.GetServices();
180             return services.Any(s => s.ServiceName == serviceName);
181         }
182 
183         /// <summary>
184         /// 卸載服務
185         /// </summary>
186         /// <param name="filepath">路徑和文件名</param>
187         public static void UnInstallService(string filepath)
188         {
189             try
190             {
191                 //UnInstall Service  
192                 var myAssemblyInstaller = new AssemblyInstaller
193                 {
194                     UseNewContext = true,
195                     Path = filepath
196                 };
197                 myAssemblyInstaller.Uninstall(null);
198                 myAssemblyInstaller.Dispose();
199             }
200             catch (Exception ex)
201             {
202                 throw new Exception("unInstallServiceError/n" + ex.Message);
203             }
204         }
205     }
206 }
 

 

  接下來我們封裝控制台的操作方法為了實現循環監聽這裡用了遞歸    
 1 using System;
 2 using System.Diagnostics;
 3 using System.IO;
 4 using System.Linq;
 5 
 6 namespace AutoInstallUtil
 7 {
 8     class Program
 9     {
10         static void Main(string[] args)
11         {
12             try
13             {
14                 ServerAction();
15             }
16             catch (Exception ex)
17             {
18                 Console.WriteLine("發生錯誤:{0}", ex.Message);
19             }
20 
21             Console.ReadKey();
22         }
23 
24         /// <summary>
25         /// 操作
26         /// </summary>
27         private static void ServerAction()
28         {
29             Console.WriteLine("請輸入:1安裝  2卸載");
30             var condition = Console.ReadLine();
31             var currentPath = Environment.CurrentDirectory;
32             var currentFileNameVshost = Path.GetFileName(Process.GetCurrentProcess().MainModule.FileName).ToLower();
33             var currentFileName = currentFileNameVshost.Replace(".vshost.exe", ".exe");
34             var files =
35                 Directory.GetFiles(currentPath)
36                     .Select(o => Path.GetFileName(o).ToLower())
37                     .ToList()
38                     .Where(
39                         o =>
40                             o != currentFileNameVshost
41                             && o != currentFileName
42                             && o.ToLower().EndsWith(".exe")
43                             && o != "installutil.exe"
44                             && !o.ToLower().EndsWith(".vshost.exe"))
45                     .ToList();
46             if (files.Count == 0)
47             {
48                 Console.WriteLine("未找到可執行文件,請確認當前目錄有需要安裝的服務程序");
49             }
50             else
51             {
52                 Console.WriteLine("找到目錄有如下可執行文件,請選擇需要安裝或卸載的文件序號:");
53             }
54             int i = 0;
55             foreach (var file in files)
56             {
57                 Console.WriteLine("序號:{0}  文件名:{1}", i, file);
58                 i++;
59             }
60             var serviceFileIndex = Console.ReadLine();
61             var servicePathName = currentPath + "\\" + files[Convert.ToInt32(serviceFileIndex)];
62             if (condition == "1")
63             {
64                 SystemServices.InstallService(null, servicePathName);
65             }
66             else
67             {
68                 SystemServices.UnInstallService(servicePathName);
69             }
70             Console.WriteLine("**********本次操作完畢**********");
71             ServerAction();
72         }
73     }

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved