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
哈哈,我一直用bat判断某个服务是否启动,有时候备份服务会自动停止,导致没有及时备份。通过任务计划定时执行bat,如果服务正常,不做处理,服务停止则启动 本帖最后由 尘缘丶 于 2021-4-30 14:45 编辑
15820394839 发表于 2021-4-30 14:35
哈哈,我一直用bat判断某个服务是否启动,有时候备份服务会自动停止,导致没有及时备份。通过任务计划定时 ...
我这边就不适合任务计划,因为手持设备的客户端本身就是winform程序,反编译导出工程后直接在main_load加上判断程序更合适,这样每次启动程序都可以校验一次,只是不知道纯C#怎么写更简洁方便高效 启动看看进程里面有没有不就行了吗? silverkey 发表于 2021-4-30 15:01
启动看看进程里面有没有不就行了吗?
给客户代购定制的设备,要傻瓜式的程序,给所有人用。正好反编译直接集成修复
没打算找厂商修复,毕竟这么点问题自己还能处理,只不过写的不专业 帮你找个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
{
// 异常处理
}
}
kumamiko 发表于 2021-4-30 16:26
帮你找个C#方法
public static void StartService(string serviceName, int t ...
谢谢 不过还差点功能,修改服务启动类型和登陆身份没有实现
页:
[1]