尘缘丶 发表于 2021-4-30 13:50

C#判断Windows服务是否已启动

起因:某手持设备扫码枪创建服务后无法启动,需要修改服务的启动类型和登录身份


功能:判断是否有相关服务,有的话是否启动,非运行状态则按照实际情况判断处理


其它:转数据库了好久没写过C#,大佬们如果可以给优化一下代码那更是感激不尽


         选择批处理是因为C#代码不知道怎么写,求大佬指教。另外有纰漏欢迎各位大牛指出


private void CheckError()
      {
                        int tempFlag = 0;//判断服务状态,初始和未创建服务为0,-1和-2则为服务未运行
                        string wcesComm = "WcesComm";
                        string rapiMgr = "RapiMgr";
                        ServiceController[] services = ServiceController.GetServices();
                        foreach (ServiceController s in services)
                        {
                                if (s.ServiceName.Equals(wcesComm) || s.ServiceName.Equals(rapiMgr))
                                {
                                        if (s.Status == ServiceControllerStatus.Running)
                                        {
                                                tempFlag++;
                                        }
                                        else
                                        {
                                                tempFlag = -2;//改为-2的原因是,如果设定为-1,那么如果第一个服务未运行tempFlag为-1
                                                                          //第二个服务运行,进入if,tempFlag++变成0,影响最终结果
                                        }
                                }
                        }
                        if (tempFlag != 2)//=2为正常,流程结束
                        {
                                MessageBox.Show("相关服务异常,请关闭杀毒软件以完成自动修复!");
                                if (tempFlag < 0)//小于0则至少有一个服务未运行
                                {
                                        Process.Start(Environment.CurrentDirectory + @"\Files\startServices.bat", "/s");
                                }
                                else//没有相关服务,静默安装创建服务的exe并修复服务启动类型和登陆身份
                                {
                                        Process.Start(Environment.CurrentDirectory + @"\Files\dev.exe", "/s");
                                        Process.Start(Environment.CurrentDirectory + @"\Files\startServices.bat", "/s");
                                }
                                Process.Start(System.Reflection.Assembly.GetExecutingAssembly().Location);
                                Application.Exit();
                        }
                }

下面是批处理文件,也是比较简单的,sc.exe设置


sc config WcesComm obj= LocalSystem
sc config RapiMgr obj= LocalSystem
sc config WcesComm start= auto
sc config RapiMgr start= auto
sc start WcesComm
sc start RapiMgr

choujie1689 发表于 2021-4-30 14:35

哈哈,我一直用bat判断某个服务是否启动,有时候备份服务会自动停止,导致没有及时备份。通过任务计划定时执行bat,如果服务正常,不做处理,服务停止则启动

尘缘丶 发表于 2021-4-30 14:41

本帖最后由 尘缘丶 于 2021-4-30 14:45 编辑

15820394839 发表于 2021-4-30 14:35
哈哈,我一直用bat判断某个服务是否启动,有时候备份服务会自动停止,导致没有及时备份。通过任务计划定时 ...
我这边就不适合任务计划,因为手持设备的客户端本身就是winform程序,反编译导出工程后直接在main_load加上判断程序更合适,这样每次启动程序都可以校验一次,只是不知道纯C#怎么写更简洁方便高效

silverkey 发表于 2021-4-30 15:01

启动看看进程里面有没有不就行了吗?

尘缘丶 发表于 2021-4-30 15:12

silverkey 发表于 2021-4-30 15:01
启动看看进程里面有没有不就行了吗?

给客户代购定制的设备,要傻瓜式的程序,给所有人用。正好反编译直接集成修复
没打算找厂商修复,毕竟这么点问题自己还能处理,只不过写的不专业

kumamiko 发表于 2021-4-30 16:26

帮你找个C#方法

public static void StartService(string serviceName, int timeoutMilliseconds)
{
ServiceController service = new ServiceController(serviceName);
try
{
    TimeSpan timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds);
        //启动服务
    service.Start();
        //等待启动
    service.WaitForStatus(ServiceControllerStatus.Running, timeout);
}
catch
{
    // 异常处理
}
}


尘缘丶 发表于 2021-4-30 16:32

kumamiko 发表于 2021-4-30 16:26
帮你找个C#方法

public static void StartService(string serviceName, int t ...

谢谢 不过还差点功能,修改服务启动类型和登陆身份没有实现
页: [1]
查看完整版本: C#判断Windows服务是否已启动