C#中调用Windows系统服务exe程序的工具类与重启服务的流程
场景
使用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程序的工具类与重启服务的流程相关推荐
- 如何在Python中调用Windows的cmd命令?
简 介: 利用os,commands,subprocess模块可以在python中调用windows中的命令.从使用方便性上来看,利用os.popen可以执行windows的程序并可以获得返回内容. ...
- 在C#中调用windows API函数
Api函数是构筑Windws应用程序的基石,每一种Windows应用程序开发工具,它提供的底层函数都间接或直接地调用了Windows API函数,同时为了实现功能扩展,一般也都提供了调用Windows ...
- C#中调用Windows API时的数据类型对应关系
C#中调用Windows API时的数据类型对应关系 原文 C#中调用Windows API时的数据类型对应关系 BOOL=System.Int32 BOOLEAN=System.Int32 BYTE ...
- 在c#中调用windows脚本的方法
在c#中调用windows脚本的方法 方法1:直接调用 CODE: System.Diagnostics.Process proc = new System.Diagnostics.Proce ...
- 在网页中调用本地的应用程序
在网页中调用本地的应用程序 例子: <script> function exec (command) { window.oldOnError = window.onerror; ...
- 退出整个Android程序的工具类
在实际的Android开发过程中常常有退出整个Android程序的需求,下面给大家介绍一下如何编写一个退出整个Android程序的工具类 package com.superGao.exitApp; i ...
- java中使用jxl导出excel表格的工具类(全网唯一亲测可用,在原来基础上扩展)
java中后台导出excel的话,有两种方案,一是使用poi(不过由于是windows版本的,存在不兼容,但功能更多,更强大),而是使用jxl(纯java编写,不过兼容,简单一些),可以设置输出的ex ...
- go 调用winapi_如何在go中调用windows api-Go语言中文社区
1.cgo环境搭建 初入go坑,记录一次工作中需要封装windows api 的过程.既然是go调用C++那么首先要配置cgo的环境了.要使用CGO特性,需要安装C/C++构建工具链,在macOS和L ...
- 如何在go中调用windows api
1.cgo环境搭建 初入go坑,记录一次工作中需要封装windows api 的过程.既然是go调用C++那么首先要配置cgo的环境了.要使用CGO特性,需要安装C/C++构建工具链,在macOS和L ...
最新文章
- docker查询占用端口号服务命令
- 台积电砸7500亿强攻5nm
- 程序员怎样获取更多的劳动收入
- Android-标题状态栏的隐藏
- 线程创建方式3-实现 callable接口(Java)
- 20175323 团队项目 服务器端函数功能与业务逻辑详解
- 凸优化第二章凸集 2.6 对偶锥与广义不等式
- 直播APP系统源码,直播系统源码 直播系统源码
- 360浏览器调试html5,360浏览器如何打开调试工具
- java键盘代码_java中各种类型的键盘输入代码是什么
- 华为 A800-9000 服务器 离线安装MindX DL 可视化环境+监控
- uniapp中使用canvas生成海报
- 【解决笔记本电脑声音音量低的方法】
- laragon超级好用的PHP服务器
- 在Windows系统上对hfds中的文件进行操作
- 读书笔记005:南怀瑾:如何做到精神内敛?
- 实验八 一阶常微分方程初值问题Matlab实现
- 计算机 教授级职称评定,工程技术应用研究员(俗称正高,教授级高工等等)职称评定...
- c语言一对多,NRF905一对多的有关问题
- storm spout读取mysql_Storm中Spout使用注意事项小结
热门文章
- 为什么阿里巴巴开发手册中强制要求 POJO 类使用包装类型?NPE问题防范
- 不仅有史上最详细Docker 安装Minio Client,还附带解决如何设置永久访问和永久下载链接!!(详图)绝对值得收藏的哈!!!!
- 手写Spring-ioc 注入 jdk反射实现 绝对满足你的好奇心哦 解决怎么我写了一个注解就可以直接注入了?
- 智能胖墩机器人_探班新雅CDIE | 智能硬件“奇幻乐园”
- java 矩阵题目_java练习本(20190604)
- mysql中一个表怎么查询多以上的信息,MySQL怎么样实现多个表的或查询?
- java web mysql树形结构_用JAVA写的树结构代码 - WEB源码|JSP源码/Java|源代码 - 源码中国...
- flac3d命令流实例大全_ANSYS APDL 疲劳分析实例附命令流
- angular4更改表单中显示的值_Angular 4 动态表单教程 Reactive Forms教程
- 需求分析中适应性怎么写_商业计划书中的市场分析怎么写,这样才完整!