如果已停止服务/流程,如何跳过告诉服务/流程停止

时间:2019-02-27 08:20:51

标签: c#

我正在构建一个应用程序以卸载程序。

首先,我需要停止所有相关的服务和流程。

经过反复试验,我创建了以下命令:


///停止SQL和Act服务

        List<string> servicesList = new List<string>{
            "ACT! Service Host",
            "ACT! Smart Task Service Host",
            "ActConnectLink",
            "SQL Server (ACT7)",
            "SQL Server Browser",
            "Act! Scheduler",
            "APFWLicensingSrvc"
        };

        foreach (string serviceName in servicesList)


        {
            StopRunningService(serviceName);
        }


    private void StopRunningService(string name)
    {
        ServiceController service = new ServiceController(name);
        if (service.Status == ServiceControllerStatus.Running)
        {
            service.Stop();
        }

    }

唯一的问题是,如果一项服务已经停止或不存在(因为这是App,因为它将删除我公司生产的3个略有不同的软件版本,因此其中一些将具有一些API功能和服务,一些不会),然后测试失败,我得到:

System.InvalidOperationException:在计算机“。”上找不到“服务“服务名称””。

因此,我想引入一个“ If”命令来帮助它解决问题。

类似“如果找到服务并且正在运行”之类的东西,然后让它继续停止服务。

然后,我可以弄清楚如何对流程执行相同的操作。

有人可以以此指向我正确的方向吗?

1 个答案:

答案 0 :(得分:1)

您可能可以使用ServiceController.GetServices

  

检索计算机上的非设备驱动程序服务以及那些   不是驱动程序。

var services = ServiceController.GetServices(machineName);

var servicesList = new List<string>
                        {
                           "ACT! Service Host",
                           "ACT! Smart Task Service Host",
                           "ActConnectLink",
                           "SQL Server (ACT7)",
                           "SQL Server Browser",
                           "Act! Scheduler",
                           "APFWLicensingSrvc"
                        };

var activeServices = services.Where(x => servicesList.Contains(x.ServiceName) && x.Status != ServiceControllerStatus.Stopped);
foreach (var service in activeServices)
{
   try
   {
      service.Stop();
   }
   catch (Exception e)
   {
      // maybe log something here
   }
}

注意 :我不认为这是解决您所有问题的方法,并且是明确的解决方案。我只是指出如何获取名称和过滤已知服务