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

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

 using System;
using System.Collections;
using System.Collections.Generic;
using System.Configuration.Install;
using System.IO;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading.Tasks; namespace Enterprise.Framework.Utils
{
/// <summary>
/// Windows服务实例的管理器,可以安装、启动、关停和卸载Windows服务实例
/// </summary>
public static class WindowsServiceInstanceManager
{
/// <summary>
/// 判断指定的名称的Windows服务是否存在
/// </summary>
/// <param name="serviceName">Windows服务的名称</param>
/// <returns>返回布尔值,true表示指定名称的Windows服务存在,false表示指定名称的Windows服务不存在</returns>
public static bool IsServiceExisted(string serviceName)
{
ServiceController[] services = ServiceController.GetServices();
foreach (ServiceController controller in services)
{
if (string.Compare(controller.ServiceName, serviceName, true) == )
{
return true;
}
}
return false;
} /// <summary>
/// 安装Windows服务,如果存在同名的服务,也认为安装时成功的
/// </summary>
/// <param name="serviceFilePath">要安装的Windows服务的文件的地址</param>
/// <param name="serviceName">要安装的Windows服务的名称,可以根据服务的名称判断其服务是否存在,如果服务存在,就不需要安装</param>
/// <returns>返回布尔值,true表示安装Windows服务成功,false表示安装Windows服务失败</returns>
public static bool InstallService(string serviceFilePath, string serviceName)
{
if (string.IsNullOrEmpty(serviceFilePath) || string.IsNullOrWhiteSpace(serviceFilePath))
{
return false;
}
if (!File.Exists(serviceFilePath))
{
return false;
}
if (this.IsServiceExisted(serviceName))
{
return true;
}
using (AssemblyInstaller installer = new AssemblyInstaller())
{
try
{
installer.UseNewContext = true;
installer.Path = serviceFilePath;
IDictionary savedState = new Hashtable();
installer.Install(savedState);
installer.Commit(savedState);
return true;
}
catch (Exception)
{
throw;
}
}
} /// <summary>
/// 卸载Windows服务,如果该名称的Windows服务不存在,也认识卸载失败
/// </summary>
/// <param name="serviceFilePath">要卸载的Windows服务文件的地址</param>
/// <param name="serviceName">要卸载的Windows服务的名称,可以根据服务的名称判断其服务是否存在,如果服务不存在,就不需要卸载</param>
/// <returns>返回布尔值,true表示卸载Windows服务成功,false表示卸载Windows服务失败</returns>
public static bool UninstallService(string serviceFilePath, string serviceName)
{
if (string.IsNullOrEmpty(serviceFilePath) || string.IsNullOrWhiteSpace(serviceFilePath))
{
return false;
}
if (!File.Exists(serviceFilePath))
{
return false;
}
if (!IsServiceExisted(serviceName))
{
return false;
}
using (AssemblyInstaller installer = new AssemblyInstaller())
{
try
{
installer.UseNewContext = true;
installer.Path = serviceFilePath;
installer.Uninstall(null);
return true;
}
catch (Exception)
{
throw;
}
}
} /// <summary>
/// 启动Windows服务
/// </summary>
/// <param name="serviceName">要启动的Windows服务的名称</param>
/// <returns>返回布尔值,true表示启动Windows服务成功,false表示启动Windows服务失败</returns>
public static bool StartService(string serviceName)
{
if (string.IsNullOrEmpty(serviceName) || string.IsNullOrWhiteSpace(serviceName))
{
return false;
}
using (ServiceController control = new ServiceController(serviceName))
{
try
{
if (control.Status == ServiceControllerStatus.Stopped)
{
control.Start();
}
return true;
}
catch (Exception)
{
throw;
}
}
} /// <summary>
/// 关停Windows服务
/// </summary>
/// <param name="serviceName">要关停Windows服务的名称</param>
/// <returns>返回布尔值,true表示关停Windows服务成功,false表示关停Windows服务失败</returns>
public static bool StopService(string serviceName)
{
if (string.IsNullOrEmpty(serviceName) || string.IsNullOrWhiteSpace(serviceName))
{
return false;
}
using (ServiceController control = new ServiceController(serviceName))
{
try
{
if (control.Status == ServiceControllerStatus.Running)
{
control.Stop();
}
return true;
}
catch (Exception)
{
throw;
}
}
}
}
}

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

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. Structs复习 Path问题

    Path问题相对复杂 主要是路劲问题 但结论很简单 就是统一使用绝对路径 jar包 web.xml <?xml version="1.0" encoding="UT ...

  2. Java学习05 (第一遍) - JSP与Servlet

    JSP 客户端发出Request请求,JSP容器将JSP转译为Servlet的源码,再编译加载到内存执行,结果Response到客户端. Request->JSP->Servlet(jav ...

  3. zabbix 监控端口

    监控HTTPD端口的shell #!/bin/bash #2019年4月19日18:: ####### httpd=` netstat -tnlp|grep httpd|awk '{print $4} ...

  4. HTTPConnectionPool(host:XX)Max retries exceeded with url

    爬虫多次访问同一个网站一段时间后会出现错误 HTTPConnectionPool(host:XX)Max retries exceeded with url '<requests.package ...

  5. tomcat 下配置 可 调试

    set JAVA_OPTS=-Djute.maxbuffer=2048000 set console_log=true 起始行配置 rem Ensure that any user defined C ...

  6. 构建缓存gradle

    结合Kotlin使用Gradle build cache 宛丘之上兮 关注 2018.03.11 00:21* 字数 1177 阅读 505评论 5喜欢 4 在2017年4月,Gradle发布了bui ...

  7. 什么是JIT,写的很好

    什么是JIT 一些其他解释的网站:http://www.sohu.com/a/169704040_464084 1.动态编译(dynamic compilation)指的是“在运行时进行编译”:与之相 ...

  8. ssm 连接两个数据库

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  9. HTTPS加密过程分析

    HTTPS加密的作目的是解决信息传输过程中数据被篡改,窃取 HTTPS使用了一系列的加密算法:对称加密算法.非对称加密算法.单向加密算法 非对称加密算法 分为公钥部分和私钥部分,用公钥加密的密文只能由 ...

  10. msf客户端渗透(二):PDF漏洞、恶意网站、flash漏洞、IE漏洞、java漏洞、android漏洞、VBScript感染payload

    这个漏洞利用只在XP上有效 利用pdf漏洞利用payload exploit生成一个pdf文件 传到被攻击机上 启动msf侦听 exploit -j XP上双击运行这个pdf时,kali获取到一个sh ...