-
C#中调用Windows系统服务exe程序的工具类与重启服务的流程
本站最新发布 C#从入门到精通
试听地址 https://www.xin3721.com/eschool/CSharpxin3721/
试听地址 https://www.xin3721.com/eschool/CSharpxin3721/
场景
使用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 + "重启成功");
栏目列表
最新更新
python数据库连接池技术总结
成人网站性能提升 20 倍之经验谈 [Python
python动态捕获异常
python 探测网站目录的GUI程序
python实现中文字符繁体和简体中文转换
Python服务器开发 -- 网络基础
python高性能编程方法一
使用python管理Cisco设备
python抓取google搜索结果
Python 自动备份SVN版本库并复制到远程主机
基于UDP的服务器端和客户端
再谈UDP和TCP
在socket编程中使用域名
网络数据传输时的大小端问题
socket编程实现文件传输功能
如何优雅地断开TCP连接?
图解TCP四次握手断开连接
详细分析TCP数据的传输过程
图解TCP数据报结构以及三次握手(非常详
TCP协议的粘包问题(数据的无边界性)
Excel数据导入到Sql server
SQL Server like 字段
SQL Server中的LEFT、RIGHT函数
sql server 安装出现需要sqlncli.msi文件,错误
SQL Server学习内容(一)
SQLServer执行大脚本文件时,提示“无法执
数据库敏捷版本控制之3个数据库策略
将select 转为json
SQL Server 创建索引(index)
GROUP BY中的WITH CUBE、WITH ROLLUP原理测试及