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

摘要:
场景使用C#编写的Windows服务程序,在Winform中进行调用。常用工具类方法检测服务是否存在或者安装,获取服务状态,启动服务,停止服务的方法。以在Winform中重启服务为例。ContinuePending=5,////摘要://服务即将暂停。这对应于Win32SERVICE_PAUSED常数,该常数定义为0x00000007。IsServiceInstalled){MessageBox.Show("服务未安装,请先安装!");returnfalse;}try{using{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;returntrue;}catch{MessageBox.Show;returnfalse;}}停止服务的方法//////停止服务//////服务全路径///服务名///publicstaticboolServiceStop{if(!
场景

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

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

以在Winform中重启服务为例。

注:

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

实现

新建工具类WinServiceHelper

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

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

获取服务状态的方法

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

注:

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

   //摘要: 
    //指示服务的当前状态。
    public enumServiceControllerStatus
    {
        //摘要: 
        //服务未运行。这对应于 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 ,stringserviceName)
        {
            if (!IsServiceInstalled(serviceName))
            {
                MessageBox.Show("服务未安装,请先安装!");
                return false;
            }
            try{
                using (System.Diagnostics.Process p = newSystem.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, stringserviceName)
        {
            if (!IsServiceInstalled(serviceName))
            {
                MessageBox.Show("服务未安装,请先安装!");
                return false;
            }
            try{
                using (System.Diagnostics.Process p = newSystem.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程序的工具类与重启服务的流程》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇洛谷P2251 质量检测40岁应该学会的是面对和取舍下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

flutter Radio单选框

单选框,允许用户从一组中选择一个选项。...

Foxyproxy 火狐代理插件

Firefox上的插件Autoproxy一直很难使用。它永远不能更新规则,但foxyproxy可以替代它。用鼠标中键单击foxyproxy图标以在不同的代理方法之间切换。foxyproxy图标从foxhead变为蓝色,因为内容传输发生在网页中,该传输通过默认代理服务器,默认代理的初始颜色为蓝色。...

图卷积神经网络(GCN)入门

不得不专门为GCN开一个新篇章,表示其重要程度。图卷积神经网络,实际上跟CNN的作用一样,就是一个特征提取器,只不过它的对象是图数据。总地来说,图数据既要考虑节点信息,也要考虑结构信息,图卷积神经网络就可以自动化地既学习节点特征,又能学习节点与节点之间的关联信息。GCN的本质目的就是用来提取拓扑图的空间特征。理解图卷积神经网络主要有两类,一类是基于空间域或顶...

R的卸载和更新安装

R包经常遇到不同版本的不兼容性。例如,与软件包相比,当前版本无论是新的还是旧的都很麻烦。最麻烦的是如何升级R软件?包括以下方法:方法1:(1)直接安装新版本(2)将旧版本库中的文件夹复制到新版本库文件夹并粘贴。如果中间有重复的名称,则不会被覆盖(需要更新基本包)。(3) 打开新版本的R并输入:update。程序包()以静默等待更新...

PB各对象常用事件

1.触发窗口中事件名称的时间01.在激活窗口之前激活触发器02。单击触发器03.Close触发器04.CloseQuery在窗口被清除或关闭时触发。...

Selenium模拟操作中按钮点击(click) 失效解决方法

在使用硒模拟操作时,我们经常会遇到一些原始方法无法解决的问题。然而,在网站的登录框中,直接位置按钮的点击元素无效,返回键也无效。分析应该是重点,但不可能尝试很多方法。实验结束后,当焦点位于登录框的用户文本框中时,按Enter键将依次从用户名框、密码框移动到提交按钮。最常见的文本框输入问题是由文本框的占位符引起的。但该方法仍然无法处理它,只能执行Script。...