场景

使用C#编写的Windows服务程序,在Winform中进行调用。

常用工具类方法检测服务是否存在或者安装,获取服务状态,启动服务,停止服务的方法。

以在Winform中重启服务为例。

注:

博客主页:
https://blog.csdn.net/badao_liumang_qizhi
关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载

实现

新建工具类WinServiceHelper

检测服务是否安装或者存在的方法

        /// <summary>/// 服务是否安装/存在/// </summary>/// <param name="serviceName">服务名</param>/// <returns></returns>public static bool IsServiceInstalled(string serviceName){bool exists = false;System.ServiceProcess.ServiceController[] services = System.ServiceProcess.ServiceController.GetServices();foreach (System.ServiceProcess.ServiceController s in services){if (s.ServiceName == serviceName){exists = true;break;}}return exists;}

获取服务状态的方法

        /// <summary>/// 获取服务状态/// </summary>/// <param name="serviceName"></param>/// <returns></returns>public static String GetServiceStatus(string serviceName){string result = "服务不存在";System.ServiceProcess.ServiceController[] services = System.ServiceProcess.ServiceController.GetServices();foreach (System.ServiceProcess.ServiceController s in services){if (s.ServiceName == serviceName){result = s.Status.ToString();break;}}return result;}

注:

服务状态返回值是枚举类型,具体返回值如下

    // 摘要://     指示服务的当前状态。public enum ServiceControllerStatus{// 摘要://     服务未运行。这对应于 Win32 SERVICE_STOPPED 常数,该常数定义为 0x00000001。Stopped = 1,//// 摘要://     服务正在启动。这对应于 Win32 SERVICE_START_PENDING 常数,该常数定义为 0x00000002。StartPending = 2,//// 摘要://     服务正在停止。这对应于 Win32 SERVICE_STOP_PENDING 常数,该常数定义为 0x00000003。StopPending = 3,//// 摘要://     服务正在运行。这对应于 Win32 SERVICE_RUNNING 常数,该常数定义为 0x00000004。Running = 4,//// 摘要://     服务即将继续。这对应于 Win32 SERVICE_CONTINUE_PENDING 常数,该常数定义为 0x00000005。ContinuePending = 5,//// 摘要://     服务即将暂停。这对应于 Win32 SERVICE_PAUSE_PENDING 常数,该常数定义为 0x00000006。PausePending = 6,//// 摘要://     服务已暂停。这对应于 Win32 SERVICE_PAUSED 常数,该常数定义为 0x00000007。Paused = 7,}

启动服务的方法

        /// <summary>/// 启动服务/// </summary>/// <param name="serivceExeFullPath">服务全路径</param>/// <param name="serviceName">服务名</param>/// <returns></returns>public static bool ServiceStart(string serivceExeFullPath ,string serviceName){if (!IsServiceInstalled(serviceName)){MessageBox.Show("服务未安装,请先安装!");return false;}try{using (System.Diagnostics.Process p = new System.Diagnostics.Process()){p.StartInfo.UseShellExecute = false;p.StartInfo.RedirectStandardOutput = true;p.StartInfo.CreateNoWindow = true;p.StartInfo.FileName = serivceExeFullPath;p.StartInfo.Arguments = "start";p.Start();p.Close();}System.Threading.Thread.Sleep(2000);return true;}catch (Exception ex){MessageBox.Show("服务安装异常:" + ex.Message);return false;}}

停止服务的方法

        /// <summary>///  停止服务/// </summary>/// <param name="serivceExeFullPath">服务全路径</param>/// <param name="serviceName">服务名</param>/// <returns></returns>public static bool ServiceStop(string serivceExeFullPath, string serviceName){if (!IsServiceInstalled(serviceName)){MessageBox.Show("服务未安装,请先安装!");return false;}try{using (System.Diagnostics.Process p = new System.Diagnostics.Process()){p.StartInfo.UseShellExecute = false;p.StartInfo.RedirectStandardInput = true;p.StartInfo.CreateNoWindow = true;p.StartInfo.FileName = serivceExeFullPath;p.StartInfo.Arguments = "stop";p.Start();p.WaitForExit();p.Close();}System.Threading.Thread.Sleep(2000);return true;}catch (Exception ex){MessageBox.Show("服务停止异常:" + ex.Message);return false;}}

重启服务示例

在重启服务的按钮的点击事件中

      //检测服务是否安装bool isInstalled = WinServiceHelper.IsServiceInstalled(Global.BTS_DATA_SERVICE_NAME);if (!isInstalled){MessageBox.Show("重启失败,服务"+Global.BTS_DATA_SERVICE_NAME+"未安装或未启动");return;}string serviceStatus = WinServiceHelper.GetServiceStatus(Global.BTS_DATA_SERVICE_NAME);if (!serviceStatus.Equals(System.ServiceProcess.ServiceControllerStatus.Running.ToString())){MessageBox.Show("重启失败,服务" + Global.BTS_DATA_SERVICE_NAME + "状态为:" + serviceStatus);return;}string serivceExeFullPath = Global.AppConfig.BtsDataServiceExe;string serviceName = Global.BTS_DATA_SERVICE_NAME;bool isStopSuccess = WinServiceHelper.ServiceStop(serivceExeFullPath,serviceName);//停止失败if (!isStopSuccess){MessageBox.Show("重启失败,服务" + Global.BTS_DATA_SERVICE_NAME + "停止失败");return;}//方法里已经休眠2秒bool isStartSuccess = WinServiceHelper.ServiceStart(serivceExeFullPath, serviceName);//启动失败if (!isStartSuccess){MessageBox.Show("重启失败,服务" + Global.BTS_DATA_SERVICE_NAME + "启动失败");return;}MessageBox.Show("服务" + Global.BTS_DATA_SERVICE_NAME + "重启成功");

C#中调用Windows系统服务exe程序的工具类与重启服务的流程相关推荐

  1. 如何在Python中调用Windows的cmd命令?

    简 介: 利用os,commands,subprocess模块可以在python中调用windows中的命令.从使用方便性上来看,利用os.popen可以执行windows的程序并可以获得返回内容. ...

  2. 在C#中调用windows API函数

    Api函数是构筑Windws应用程序的基石,每一种Windows应用程序开发工具,它提供的底层函数都间接或直接地调用了Windows API函数,同时为了实现功能扩展,一般也都提供了调用Windows ...

  3. C#中调用Windows API时的数据类型对应关系

    C#中调用Windows API时的数据类型对应关系 原文 C#中调用Windows API时的数据类型对应关系 BOOL=System.Int32 BOOLEAN=System.Int32 BYTE ...

  4. 在c#中调用windows脚本的方法

    在c#中调用windows脚本的方法 方法1:直接调用   CODE:   System.Diagnostics.Process proc = new System.Diagnostics.Proce ...

  5. 在网页中调用本地的应用程序

    在网页中调用本地的应用程序 例子: <script> function exec (command) {     window.oldOnError = window.onerror;   ...

  6. 退出整个Android程序的工具类

    在实际的Android开发过程中常常有退出整个Android程序的需求,下面给大家介绍一下如何编写一个退出整个Android程序的工具类 package com.superGao.exitApp; i ...

  7. java中使用jxl导出excel表格的工具类(全网唯一亲测可用,在原来基础上扩展)

    java中后台导出excel的话,有两种方案,一是使用poi(不过由于是windows版本的,存在不兼容,但功能更多,更强大),而是使用jxl(纯java编写,不过兼容,简单一些),可以设置输出的ex ...

  8. go 调用winapi_如何在go中调用windows api-Go语言中文社区

    1.cgo环境搭建 初入go坑,记录一次工作中需要封装windows api 的过程.既然是go调用C++那么首先要配置cgo的环境了.要使用CGO特性,需要安装C/C++构建工具链,在macOS和L ...

  9. 如何在go中调用windows api

    1.cgo环境搭建 初入go坑,记录一次工作中需要封装windows api 的过程.既然是go调用C++那么首先要配置cgo的环境了.要使用CGO特性,需要安装C/C++构建工具链,在macOS和L ...

最新文章

  1. docker查询占用端口号服务命令
  2. 台积电砸7500亿强攻5nm
  3. 程序员怎样获取更多的劳动收入
  4. Android-标题状态栏的隐藏
  5. 线程创建方式3-实现 callable接口(Java)
  6. 20175323 团队项目 服务器端函数功能与业务逻辑详解
  7. 凸优化第二章凸集 2.6 对偶锥与广义不等式
  8. 直播APP系统源码,直播系统源码 直播系统源码
  9. 360浏览器调试html5,360浏览器如何打开调试工具
  10. java键盘代码_java中各种类型的键盘输入代码是什么
  11. 华为 A800-9000 服务器 离线安装MindX DL 可视化环境+监控
  12. uniapp中使用canvas生成海报
  13. 【解决笔记本电脑声音音量低的方法】
  14. laragon超级好用的PHP服务器
  15. 在Windows系统上对hfds中的文件进行操作
  16. 读书笔记005:南怀瑾:如何做到精神内敛?
  17. 实验八 一阶常微分方程初值问题Matlab实现
  18. 计算机 教授级职称评定,工程技术应用研究员(俗称正高,教授级高工等等)职称评定...
  19. c语言一对多,NRF905一对多的有关问题
  20. storm spout读取mysql_Storm中Spout使用注意事项小结

热门文章

  1. 为什么阿里巴巴开发手册中强制要求 POJO 类使用包装类型?NPE问题防范
  2. 不仅有史上最详细Docker 安装Minio Client,还附带解决如何设置永久访问和永久下载链接!!(详图)绝对值得收藏的哈!!!!
  3. 手写Spring-ioc 注入 jdk反射实现 绝对满足你的好奇心哦 解决怎么我写了一个注解就可以直接注入了?
  4. 智能胖墩机器人_探班新雅CDIE | 智能硬件“奇幻乐园”
  5. java 矩阵题目_java练习本(20190604)
  6. mysql中一个表怎么查询多以上的信息,MySQL怎么样实现多个表的或查询?
  7. java web mysql树形结构_用JAVA写的树结构代码 - WEB源码|JSP源码/Java|源代码 - 源码中国...
  8. flac3d命令流实例大全_ANSYS APDL 疲劳分析实例附命令流
  9. angular4更改表单中显示的值_Angular 4 动态表单教程 Reactive Forms教程
  10. 需求分析中适应性怎么写_商业计划书中的市场分析怎么写,这样才完整!