当前位置:
首页 > Python基础教程 >
-
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 + "重启成功");
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式