Windows服务

Microsoft Windows 服务(即,以前的 NT 服务)使您能够创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序。这些服务可以在计算机启动时自动启动,可以暂停和重新启动而且不显示任何用户界面。这种服务非常适合在服务器上使用,或任何时候,为了不影响在同一台计算机上工作的其他用户,需要长时间运行功能时使用。还可以在不同于登录用户的特定用户帐户或默认计算机帐户的安全上下文中运行服务。

创建Windows服务应用程序 即创建 Windows窗体应用程序 项目

然后再项目上添加新建项

选中Windows服务文件 出现设计界面后 在界面任意位置右键  添加安装程序

出现如下安装界面

选中 serviceInstaller 按 F4 可更改服务属性

Description :服务描述

DisplayName :服务显示名称

ServiceName :服务的真实名称

StartType :服务的 启动 类型 【手动启动、自动启动、禁用】

选中 serviceProcessInstaller 按 F4 设置服务的 登录 类型

在 MyService.cs 文件中写 服务启动 和 停止 分别 执行的 代码

最后在 Program Main() 方法中 写调用服务的 代码

以上操作就可以成功编写一个 Windows服务 了

继续,我们对 Windows 服务 进行安装

仍然创建一个 Windows 窗体应用程序 对刚创建的服务 进行操作【安装 、启动 、停止 、卸载】

  1. using System;
  2. using System.Collections;
  3. using System.Configuration.Install;
  4. using System.ServiceProcess;
  5. using System.Windows.Forms;
  6.  
  7. namespace WindowsServiceInstallProgram
  8. {
  9. public partial class ServicePacageInstall : Form
  10. {
  11. public ServicePacageInstall()
  12. {
  13. InitializeComponent();
  14. }
  15.  
  16. string serviceProgramPath = Application.StartupPath + "\\MyService.exe";//安装服务路径
  17. string serviceName = "ownService";//安装服务名称 非 服务显示 名称
  18.  
  19. /// <summary>
  20. /// 安装服务
  21. /// </summary>
  22. /// <param name="sender"></param>
  23. /// <param name="e"></param>
  24. private void btnInstallService_Click(object sender, EventArgs e)
  25. {
  26. try
  27. {
  28. if (IsExistsService(serviceName))
  29. {
  30. UninstallService(serviceProgramPath);
  31. }
  32. InstallService(serviceProgramPath);
  33. MessageBox.Show(
  34. string.Format("服务【{0}】安装成功!\r\n时间:【{1}】", serviceName, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")),
  35. "Tips:", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
  36. }
  37. catch (Exception ex)
  38. {
  39. MessageBox.Show(
  40. string.Format("服务【{0}】安装失败!\r\n错误信息:【{1}】", serviceName, ex.Message),
  41. "Tips:", MessageBoxButtons.OK, MessageBoxIcon.Hand);
  42. }
  43.  
  44. }
  45.  
  46. /// <summary>
  47. /// 启动服务
  48. /// </summary>
  49. /// <param name="sender"></param>
  50. /// <param name="e"></param>
  51. private void btnLaunchService_Click(object sender, EventArgs e)
  52. {
  53. try
  54. {
  55. if (IsExistsService(serviceName))
  56. {
  57. LaunchService(serviceName);
  58. }
  59. MessageBox.Show(
  60. string.Format("服务【{0}】成功启动!\r\n时间:【{1}】", serviceName, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")),
  61. "Tips:", MessageBoxButtons.OK, MessageBoxIcon.Information);
  62. }
  63. catch (Exception ex)
  64. {
  65. MessageBox.Show(
  66. string.Format("服务【{0}】启动失败!\r\n错误信息:【{1}】", serviceName, ex.Message),
  67. "Tips:", MessageBoxButtons.OK, MessageBoxIcon.Hand);
  68. }
  69. }
  70.  
  71. /// <summary>
  72. /// 停止服务
  73. /// </summary>
  74. /// <param name="sender"></param>
  75. /// <param name="e"></param>
  76. private void btnStopService_Click(object sender, EventArgs e)
  77. {
  78. try
  79. {
  80. if (IsExistsService(serviceName))
  81. {
  82. StopService(serviceName);
  83. }
  84. MessageBox.Show(
  85. string.Format("服务【{0}】成功停止!\r\n时间:【{1}】", serviceName, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")),
  86. "Tips:", MessageBoxButtons.OK, MessageBoxIcon.Information);
  87. }
  88. catch (Exception ex)
  89. {
  90. MessageBox.Show(
  91. string.Format("服务【{0}】停止失败!\r\n错误信息:【{1}】", serviceName, ex.Message),
  92. "Tips:", MessageBoxButtons.OK, MessageBoxIcon.Hand);
  93. }
  94. }
  95.  
  96. /// <summary>
  97. /// 卸载服务
  98. /// </summary>
  99. /// <param name="sender"></param>
  100. /// <param name="e"></param>
  101. private void btnUninstallService_Click(object sender, EventArgs e)
  102. {
  103. try
  104. {
  105. if (IsExistsService(serviceName))
  106. {
  107. StopService(serviceName);
  108. UninstallService(serviceProgramPath);
  109. MessageBox.Show(
  110. string.Format("服务【{0}】成功卸载!\r\n时间:【{1}】", serviceName, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")),
  111. "Tips:", MessageBoxButtons.OK, MessageBoxIcon.Information);
  112. }
  113. else
  114. {
  115. MessageBox.Show(
  116. string.Format("服务【{0}】不存在!\r\n时间:【{1}】", serviceName, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")),
  117. "Tips:", MessageBoxButtons.OK, MessageBoxIcon.Information);
  118. }
  119. }
  120. catch (Exception ex)
  121. {
  122. MessageBox.Show(
  123. string.Format("服务【{0}】卸载失败!\r\n错误信息:【{1}】", serviceName, ex.Message),
  124. "Tips:", MessageBoxButtons.OK, MessageBoxIcon.Hand);
  125. }
  126. }
  127.  
  128. #region 判断服务是否存在
  129. private bool IsExistsService(string serviceName)
  130. {
  131. /* 另一种方法
  132. 得到当前计算机所有服务对象
  133. serviceController[] serviceControllers = ServiceController.GetServices();
  134. 通过服务名【ServiceName】(非显示服务名DisplayServiceName) 得到服务对象①
  135. ServiceController serviceController = serviceControllers.SingleOrDefault(s => s.ServiceName == serviceName);
  136. */
  137. foreach (ServiceController sc in ServiceController.GetServices())
  138. {
  139. if (sc.ServiceName.ToUpper() == serviceName.ToUpper())
  140. {
  141. return true;
  142. }
  143. }
  144. return false;
  145. }
  146. #endregion
  147.  
  148. #region 安装服务
  149. private void InstallService(string serviceProgramPath)
  150. {
  151. using (AssemblyInstaller installer = new AssemblyInstaller())
  152. {
  153. installer.UseNewContext = true;
  154. installer.Path = serviceProgramPath;
  155. IDictionary saveState = new Hashtable();
  156. installer.Install(saveState);
  157. installer.Commit(saveState);
  158. }
  159. }
  160. #endregion
  161.  
  162. #region 启动服务
  163. private void LaunchService(string serviceName)
  164. {
  165. using (ServiceController currentService = new ServiceController(serviceName))
  166. {
  167. if (currentService.Status == ServiceControllerStatus.Stopped)
  168. {
  169. currentService.Start();
  170. }
  171. }
  172. }
  173. #endregion
  174.  
  175. #region 停止服务
  176. private void StopService(string serviceName)
  177. {
  178. using (ServiceController service = new ServiceController(serviceName))
  179. {
  180. if (service.Status == ServiceControllerStatus.Running)
  181. {
  182. service.Stop();
  183. }
  184. }
  185. }
  186. #endregion
  187.  
  188. #region 卸载服务
  189. private void UninstallService(string serviceProgramPath)
  190. {
  191. using (AssemblyInstaller installer = new AssemblyInstaller())
  192. {
  193. installer.UseNewContext = true;
  194. installer.Path = this.serviceProgramPath;
  195. installer.Uninstall(null);
  196. }
  197. }
  198. #endregion
  199. }
  200. }

记得用管理员身份运行起来,否则会操作 失败的

未用管理员权限运行结果

管理员权限运行结果 如下

效果如下

手把手教用C#编写Windows服务 并控制服务 安装、启动、停止、卸载的更多相关文章

  1. Windows下Apache的下载安装启动停止

    一:下载 打开任意浏览器,输入网址:http://httpd.apache.org/ 进入如下界面: 我们选择最新版Apache httpd 2.4.12Released,点击Download,进入如 ...

  2. c#用控制台程序安装启动停止卸载服务

    第一步:新建控制台项目  第二步:添加服务 第三步:右键新建完成的服务项 点击 在start 和stop事件中分别写上   第四步 编写代码 双击打开 using System; using Syst ...

  3. c# windows server安装启动与卸载

    使用installutil.exe安装卸载服务时,由于需要指向服务的全路径,由于生成目录往往不是服务发布的最终目录,很不便利,下面介绍两种方式方便操作: 方式一: 项目中加入install.bat与u ...

  4. 手把手教你写一个windows服务 【基于.net】 附实用小工具{注册服务/开启服务/停止服务/删除服务}

    1,本文适用范围 语言:.net 服务类型:windows服务,隔一段时间执行 2,服务搭建: 1,在vs中创建 console程序 2,在console项目所在类库右键 添加-新建项-选择Windo ...

  5. 手把手教你如何在Windows下allure与jenkins的集成生成让你一见钟情的测试报告 - 03(非常详细,非常实用)

    简介 好了,国庆假期结束,开始搬砖.为什么要把allure和jenkins集成了?原因是集成以后,我们就可以直接查看allure的结果,不需要重复输入命令.重复使用浏览器打开文件来查看allure的结 ...

  6. 手把手教你用Abp vnext构建API接口服务

    ABP是一个开源应用程序框架,该项目是ASP.NET Boilerplate Web应用程序框架的下一代,专注于基于ASP.NET Core的Web应用程序开发,也支持开发控制台应用程序. 官方网站: ...

  7. 手把手教你掌握——性能工具Jmeter之参数化(含安装教程 )

    本节大纲 Jmeter 发送get/post请求 Jmeter 之文件参数化-TXT/Csv Jmeter之文件参数化-断言 JMeter简介 Apache JMeter是一款基于JAVA的压力测试T ...

  8. windows下oracle 11g r2 安装过程与卸载详细图解

    Oracle 11g安装 1.解压下载的包,然后进入包内,点击setup.exe开始安装 . 2.出现如下:一般把那个小对勾取消,点击下一步进行, 弹出下图这个后点‘是' 3.下图后,选择创建和配置数 ...

  9. Windows服务程序的原理及实现(服务分为WIN32服务和系统服务)

    今天给大家讲下怎样做一个服务程序...本来是想详细讲的,不过写着写着累得要命..很多 地方就没详细...不过代码我加了点注...如果还有一些不明白的自己查下MSDN......便宜 环境,,VC++6 ...

随机推荐

  1. 【ARM-Linux开发】【CUDA开发】【视频开发】关于Linux下利用GPU对视频进行硬件加速转码的方案

    最近一直在研究Linux下利用GPU进行硬件加速转码的方案,折腾了很久,至今没有找到比较理想的硬加速转码方案.似乎网上讨论这一方案的文章也特别少,这个过程中也进行了各种尝试,遇到很多具体问题,以下便对 ...

  2. 高级UI-UI绘制流程

    UI的绘制流程和事件分发,属于Android里面的重点内容,在做自定义UI的时候,更是应该了解UI的绘制流程是如何的,此篇文章就是说明UI的绘制流程,事件分发前面已经详细讲过了 UI绘制流程探索 这里 ...

  3. Miller_Rabin算法_单个素数检测_启发式算法

    /** Miller_Rabin 算法进行素数测试 快速判断一个<2^63的数是不是素数,主要是根据费马小定理 */ #define ll __int128 ; ///随机化算法判定次数 ll ...

  4. LeetCode 32. 最长有效括号(Longest Valid Parentheses) 31

    32. 最长有效括号 32. Longest Valid Parentheses 题目描述 给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度. 每日一算法2019/6/ ...

  5. 【LeetCode】最长公共前缀【二分】

    编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: ["flower","flow" ...

  6. 微信小程序访问豆瓣电影api400错误解决方法

    最近在跟着demo学习微信小程序,却卡在了第一步请求豆瓣电影api上,折腾了很久,代码如下: wx.request({ url : "https://api.douban.com/v2/mo ...

  7. proc 目录介绍

    /proc/apm  高级电源管理(APM)版本信息及电池相关状态信息,通常由apm命令使用: /proc/buddyinfo  用于诊断内存碎片问题的相关信息文件: /proc/cmdline  在 ...

  8. java接入微信JS-SDK

    在微信公众号开发中不可,jssdk的接入虽然不是必须,但是根据业务需求我们还是可能用到,下面是自己整理的关于java接入的jssdk的方法,这里是记录关于接入微信JS-SDK的准备工作,关于接入JS- ...

  9. CEF4Delphi 常用设置

    CEF4Delphi是由 SalvadorDíazFau 创建的一个开源项目,用于在基于Delphi的应用程序中嵌入基于Chromium的浏览器. CEF4Delphi 基于Henri Gourves ...

  10. github中的各种操作

    1.上传文件到github 如图,你现在有三个项目在一个文件夹中,我们要把它上传到自己的github仓库中,该怎么做呢? 1.首先右击空白处,点击Git Bash Here,出现命令行 2. git ...