最近在重构公司的系统,把一些需要独立执行、并不需要人为关注的组件转换为Windows服务,Windows服务在使用的过程中有很多好处,相信这一点,就不用我多说了。但是每次都要建立Windows服务项目,编写服务代码,建立服务的安装程序,然后还要通过InstallUtil.exe这个命令来安装Windows服务,如果要是想卸载也要使用这个命令,只是在InstallUtil.exe这个命令后增加一个参数/u,表示卸载,我相信大家都对这个很熟悉了,我就不多说了。

  我为了不想使用这个命令来安装和卸载Windows服务,我就自己写了一个工具类,已经完全经过了单元测试,完全靠谱,大家可以放心使用。话不多说,直接上代码,代码有注释,其实也不是很难,相信大家都能看的懂。

  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Configuration.Install;
  5. using System.IO;
  6. using System.Linq;
  7. using System.ServiceProcess;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10.  
  11. namespace Enterprise.Framework.Utils
  12. {
  13. /// <summary>
  14. /// Windows服务实例的管理器,可以安装、启动、关停和卸载Windows服务实例
  15. /// </summary>
  16. public static class WindowsServiceInstanceManager
  17. {
  18. /// <summary>
  19. /// 判断指定的名称的Windows服务是否存在
  20. /// </summary>
  21. /// <param name="serviceName">Windows服务的名称</param>
  22. /// <returns>返回布尔值,true表示指定名称的Windows服务存在,false表示指定名称的Windows服务不存在</returns>
  23. public static bool IsServiceExisted(string serviceName)
  24. {
  25. ServiceController[] services = ServiceController.GetServices();
  26. foreach (ServiceController controller in services)
  27. {
  28. if (string.Compare(controller.ServiceName, serviceName, true) == )
  29. {
  30. return true;
  31. }
  32. }
  33. return false;
  34. }
  35.  
  36. /// <summary>
  37. /// 安装Windows服务,如果存在同名的服务,也认为安装时成功的
  38. /// </summary>
  39. /// <param name="serviceFilePath">要安装的Windows服务的文件的地址</param>
  40. /// <param name="serviceName">要安装的Windows服务的名称,可以根据服务的名称判断其服务是否存在,如果服务存在,就不需要安装</param>
  41. /// <returns>返回布尔值,true表示安装Windows服务成功,false表示安装Windows服务失败</returns>
  42. public static bool InstallService(string serviceFilePath, string serviceName)
  43. {
  44. if (string.IsNullOrEmpty(serviceFilePath) || string.IsNullOrWhiteSpace(serviceFilePath))
  45. {
  46. return false;
  47. }
  48. if (!File.Exists(serviceFilePath))
  49. {
  50. return false;
  51. }
  52. if (this.IsServiceExisted(serviceName))
  53. {
  54. return true;
  55. }
  56. using (AssemblyInstaller installer = new AssemblyInstaller())
  57. {
  58. try
  59. {
  60. installer.UseNewContext = true;
  61. installer.Path = serviceFilePath;
  62. IDictionary savedState = new Hashtable();
  63. installer.Install(savedState);
  64. installer.Commit(savedState);
  65. return true;
  66. }
  67. catch (Exception)
  68. {
  69. throw;
  70. }
  71. }
  72. }
  73.  
  74. /// <summary>
  75. /// 卸载Windows服务,如果该名称的Windows服务不存在,也认识卸载失败
  76. /// </summary>
  77. /// <param name="serviceFilePath">要卸载的Windows服务文件的地址</param>
  78. /// <param name="serviceName">要卸载的Windows服务的名称,可以根据服务的名称判断其服务是否存在,如果服务不存在,就不需要卸载</param>
  79. /// <returns>返回布尔值,true表示卸载Windows服务成功,false表示卸载Windows服务失败</returns>
  80. public static bool UninstallService(string serviceFilePath, string serviceName)
  81. {
  82. if (string.IsNullOrEmpty(serviceFilePath) || string.IsNullOrWhiteSpace(serviceFilePath))
  83. {
  84. return false;
  85. }
  86. if (!File.Exists(serviceFilePath))
  87. {
  88. return false;
  89. }
  90. if (!IsServiceExisted(serviceName))
  91. {
  92. return false;
  93. }
  94. using (AssemblyInstaller installer = new AssemblyInstaller())
  95. {
  96. try
  97. {
  98. installer.UseNewContext = true;
  99. installer.Path = serviceFilePath;
  100. installer.Uninstall(null);
  101. return true;
  102. }
  103. catch (Exception)
  104. {
  105. throw;
  106. }
  107. }
  108. }
  109.  
  110. /// <summary>
  111. /// 启动Windows服务
  112. /// </summary>
  113. /// <param name="serviceName">要启动的Windows服务的名称</param>
  114. /// <returns>返回布尔值,true表示启动Windows服务成功,false表示启动Windows服务失败</returns>
  115. public static bool StartService(string serviceName)
  116. {
  117. if (string.IsNullOrEmpty(serviceName) || string.IsNullOrWhiteSpace(serviceName))
  118. {
  119. return false;
  120. }
  121. using (ServiceController control = new ServiceController(serviceName))
  122. {
  123. try
  124. {
  125. if (control.Status == ServiceControllerStatus.Stopped)
  126. {
  127. control.Start();
  128. }
  129. return true;
  130. }
  131. catch (Exception)
  132. {
  133. throw;
  134. }
  135. }
  136. }
  137.  
  138. /// <summary>
  139. /// 关停Windows服务
  140. /// </summary>
  141. /// <param name="serviceName">要关停Windows服务的名称</param>
  142. /// <returns>返回布尔值,true表示关停Windows服务成功,false表示关停Windows服务失败</returns>
  143. public static bool StopService(string serviceName)
  144. {
  145. if (string.IsNullOrEmpty(serviceName) || string.IsNullOrWhiteSpace(serviceName))
  146. {
  147. return false;
  148. }
  149. using (ServiceController control = new ServiceController(serviceName))
  150. {
  151. try
  152. {
  153. if (control.Status == ServiceControllerStatus.Running)
  154. {
  155. control.Stop();
  156. }
  157. return true;
  158. }
  159. catch (Exception)
  160. {
  161. throw;
  162. }
  163. }
  164. }
  165. }
  166. }

  好了,这就是今天自己的一点小作品,每天进步一点点,努力坚持。不忘初心,继续努力吧,欢迎大家前来讨论。

Windows服务安装、卸载、启动和关闭的管理器的更多相关文章

  1. C#编写的windows服务安装后启动提示“服务启动后又停止了”

    使用C#编写的windows服务安装到服务器上行后进行启动时,总是提示“服务启动后又停止了”. 检查了服务逻辑是没问题,安装在开发本地也是正常,网上查了资料说是可能是服务没有注册,我检查了服务是正常注 ...

  2. C#版Windows服务安装卸载小工具-附源码

    前言 在我们的工作中,经常遇到Windows服务的安装和卸载,在之前公司也普写过一个WinForm程序选择安装路径,这次再来个小巧灵活的控制台程序,不用再选择,只需放到需要安装服务的目录中运行就可以实 ...

  3. windows服务安装卸载

    到C盘下找到对应的开发VS的installutil.exe文件,复制到程序的执行文件(*.exe)相同目录下在开始程序中找到VS命令提示工具 转到程序的执行文件(*.exe)目录下 C:\>cd ...

  4. 2.Windows服务-->安装卸载服务

    1.使用vs组件“VS2012开发人员命令提示” 工具,进行安装卸载服务(必须以“管理员身份运行") 安装和卸载的时候选择合适的安装程序工具地址,例如: 安装服务:C:\Windows\Mi ...

  5. windows 服务 安装 删除 启动 停止

    一.停止 sc stop 服务名 二.删除 sc delete 服务名 注意:有时删除不了,报什么“服务为删除标识” ,请将服务窗口关掉就好了. 三.创建 sc create XmlcSendServ ...

  6. Windows服务安装与卸载

    Windows服务安装与卸载,使用到了InstallUtil.exe 安装: c: cd "C:\Windows\Microsoft.NET\Framework\v4.0.30319&quo ...

  7. C# windows服务安装及卸载

    --C# windows服务安装及卸载   保存BAT文件  执行即可 @SET FrameworkDir=%WINDIR%\Microsoft.NET\Framework@SET Framework ...

  8. Windows 服务安装与卸载 (通过 Sc.exe)

    1. 安装 新建文本文件,重命名为 ServiceInstall.bat,将 ServiceInstall.bat 的内容替换为: sc create "Verity Platform De ...

  9. Windows 服务安装与卸载 (通过 installutil.exe)

    1. 安装 安装 .NET Framework ; 新建文本文件,重命名为 ServiceInstall.bat,将 ServiceInstall.bat 的内容替换为: C:\\Windows\\M ...

随机推荐

  1. JAVAWEB 一一框架整合(SSI : Spring+SpringMVC+ ibtis)

    web.xml applicationContext.xml springmvc-servlet.xml UserController package com.ssi.controller; impo ...

  2. spring boot 使用war包部署

  3. js基础-运算符

    100 * "20" 字符串转数字 5 * "ss"  NAN "ss" 转数字返回NAN 任何数字与NAN +-*/ 都返回NAN 5/N ...

  4. centos7里面docker不能下载本地源

    报这种错的 编辑这个文件 加上这一段内容 rstart重启,搞定.

  5. Node KeyNote

    [Node KeyNote] 1.实际上,.node文件在windows下它是一个.dll文件,在*nix下则是一个.so文件. 2.默认变量 function(exports, require, m ...

  6. Oracle11g RAC安装

    双节点RAC环境,数据库 racdb 实例1:racdb1      实例2:racdb2 1.IP规划 名称             oracle-db1    oracle-db2PUBLIC I ...

  7. msf客户端渗透(十):社会工程学

    启动社会工程学攻击组件 生成二维码攻击模块 输入你想生成二维码的url,这里做演示用www.baidu.com 二维码生成后,在这个路径下 生成u盘,DVD的多媒体攻击载荷 通过修改autorun.i ...

  8. python websocket网页实时显示远程服务器日志信息

    功能:用websocket技术,在运维工具的浏览器上实时显示远程服务器上的日志信息 一般我们在运维工具部署环境的时候,需要实时展现部署过程中的信息,或者在浏览器中实时显示程序日志给开发人员看.你还在用 ...

  9. zabbix web 配置

    一.汉化 1.在windows中找一些自己喜欢的字体: 2.将字体上传至/var/www/html/zabbix/fonts 目录下(我上传的字体为:simhei.ttf) 3.在/var/www/h ...

  10. NumPy 字节交换

    NumPy 字节交换 在几乎所有的机器上,多字节对象都被存储为连续的字节序列.字节顺序,是跨越多字节的程序对象的存储规则. 大端模式:指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地 ...