做项目需要对Windows服务进行操作,从网上找了一些资料,总结如下:
(以下程序在程序中测试通过)
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Text; 7 using System.Windows.Forms; 8 using System.Collections; 9 using System.Configuration.Install; 10 using System.Collections.Specialized; 11 using System.ServiceProcess; 12 13 namespace IAU.ServerInstall.BLL 14 { 15 public class ServiceControl 16 { 17 /// <summary> 18 /// 注册服务(注册完就启动,已经存在的服务直接启动。) 19 /// </summary> 20 /// <param name="strServiceName">服务名称</param> 21 /// <param name="strServiceInstallPath">服务安装程序完整路径(.exe程序完整路径)</param> 22 public void Register(string strServiceName, string strServiceInstallPath) 23 { 24 IDictionary mySavedState = new Hashtable(); 25 26 try 27 { 28 System.ServiceProcess.ServiceController service = new System.ServiceProcess.ServiceController(strServiceName); 29 30 //服务已经存在则卸载 31 if (ServiceIsExisted(strServiceName)) 32 { 33 //StopService(strServiceName); 34 UnInstallService(strServiceName, strServiceInstallPath); 35 } 36 service.Refresh(); 37 //注册服务 http://www.cnblogs.com/sosoft/ 38 AssemblyInstaller myAssemblyInstaller = new AssemblyInstaller(); 39 40 mySavedState.Clear(); 41 myAssemblyInstaller.Path = strServiceInstallPath; 42 myAssemblyInstaller.UseNewContext = true; 43 myAssemblyInstaller.Install(mySavedState); 44 myAssemblyInstaller.Commit(mySavedState); 45 myAssemblyInstaller.Dispose(); 46 47 service.Start(); 48 } 49 catch (Exception ex) 50 { 51 throw new Exception("注册服务时出错:" + ex.Message); 52 } 53 } 54 55 /// <summary> 56 /// 卸载服务 57 /// </summary> 58 /// <param name="strServiceName">服务名称</param> 59 /// <param name="strServiceInstallPath">服务安装程序完整路径(.exe程序完整路径)</param> 60 public void UnInstallService(string strServiceName, string strServiceInstallPath) 61 { 62 try 63 { 64 if (ServiceIsExisted(strServiceName)) 65 { 66 //UnInstall Service 67 AssemblyInstaller myAssemblyInstaller = new AssemblyInstaller(); 68 myAssemblyInstaller.UseNewContext = true; 69 myAssemblyInstaller.Path = strServiceInstallPath; 70 myAssemblyInstaller.Uninstall(null); 71 myAssemblyInstaller.Dispose(); 72 } 73 } 74 catch (Exception ex) 75 { 76 throw new Exception("卸载服务时出错:" + ex.Message); 77 } 78 } 79 80 81 /// <summary> 82 /// 判断服务是否存在 83 /// </summary> 84 /// <param name="serviceName">服务名</param> 85 /// <returns></returns> 86 public bool ServiceIsExisted(string serviceName) 87 { 88 ServiceController[] services = ServiceController.GetServices(); 89 foreach (ServiceController s in services) 90 { 91 if (s.ServiceName == serviceName) 92 { 93 return true; 94 } 95 } 96 return false; 97 } 98 99 /// <summary> 100 /// 启动服务(启动存在的服务,30秒后启动失败报错) 101 /// </summary> 102 /// <param name="serviceName">服务名</param> 103 public void StartService(string serviceName) 104 { 105 if (ServiceIsExisted(serviceName)) 106 { 107 System.ServiceProcess.ServiceController service = new System.ServiceProcess.ServiceController(serviceName); 108 if (service.Status != System.ServiceProcess.ServiceControllerStatus.Running && service.Status != System.ServiceProcess.ServiceControllerStatus.StartPending) 109 { 110 service.Start(); 111 for (int i = 0; i < 30; i++) 112 { 113 service.Refresh(); 114 System.Threading.Thread.Sleep(1000); 115 if (service.Status == System.ServiceProcess.ServiceControllerStatus.Running) 116 { 117 break; 118 } 119 if (i == 29) 120 { 121 throw new Exception("服务" + serviceName + "启动失败!"); 122 } 123 } 124 } 125 } 126 } 127 128 /// <summary> 129 /// 停止服务(停止存在的服务,30秒后停止失败报错) 130 /// </summary> 131 /// <param name="serviceName"></param> 132 public void StopService(string serviceName) 133 { 134 if (ServiceIsExisted(serviceName)) 135 { 136 System.ServiceProcess.ServiceController service = new System.ServiceProcess.ServiceController(serviceName); 137 if (service.Status == System.ServiceProcess.ServiceControllerStatus.Running) 138 { 139 service.Stop(); 140 for (int i = 0; i < 30; i++) 141 { 142 service.Refresh(); 143 System.Threading.Thread.Sleep(1000); 144 if (service.Status == System.ServiceProcess.ServiceControllerStatus.Stopped) 145 { 146 break; 147 } 148 if (i == 29) 149 { 150 throw new Exception("服务" + serviceName + "停止失败!"); 151 } 152 } 153 } 154 } 155 } 156 } 157 }
博客园 柔城 以上代码概述:
C#对Windows服务操作(注册安装服务,卸载服务,启动停止服务,判断服务存在)