吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2322|回复: 6
收起左侧

[其他转载] C#判断Windows服务是否已启动

[复制链接]
尘缘丶 发表于 2021-4-30 13:50
起因:某手持设备扫码枪创建服务后无法启动,需要修改服务的启动类型和登录身份


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


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


           选择批处理是因为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设置


[PowerShell] 纯文本查看 复制代码
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#方法

[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#方法

[mw_shl_code=csharp,true]public static void StartService(string serviceName, int t ...

谢谢 不过还差点功能,修改服务启动类型和登陆身份没有实现
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 16:27

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表