我正在构建一个应用程序以卸载程序。
首先,我需要停止所有相关的服务和流程。
经过反复试验,我创建了以下命令:
///停止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”命令来帮助它解决问题。
类似“如果找到服务并且正在运行”之类的东西,然后让它继续停止服务。
然后,我可以弄清楚如何对流程执行相同的操作。
有人可以以此指向我正确的方向吗?
答案 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
}
}
注意 :我不认为这是解决您所有问题的方法,并且是明确的解决方案。我只是指出如何获取名称和过滤已知服务