Если вы хотите использовать WMI более интуитивно понятный класс ServiceController
, см. this article (извините за цветовое решение, но он имеет то, что вы хотите).
Пример кода (обработка ошибок здесь немного жестко, на мой вкус):
using System.Management;
public static ReturnValue StartService(string svcName)
{
string objPath = string.Format("Win32_Service.Name='{0}'", svcName);
using (ManagementObject service = new ManagementObject(new ManagementPath(objPath)))
{
try
{
ManagementBaseObject outParams = service.InvokeMethod("StartService",
null, null);
return (ReturnValue)Enum.Parse(typeof(ReturnValue),
outParams["ReturnValue"].ToString());
}
catch (Exception ex)
{
if (ex.Message.ToLower().Trim() == "not found" ||
ex.GetHashCode() == 41149443)
return ReturnValue.ServiceNotFound;
else
throw ex;
}
}
}
* Может * WMI сделать это? Есть ли проблема с использованием класса ServiceController? Конечно, WMI может рассказать вам о сервисе с точки зрения выполнения процесса, и оттуда вы можете запустить()/terminate() процесс, но это похоже на то, что вы пропускаете совершенно очевидный уровень абстракции, выбирая не использовать класс ServiceController. Примечание: Пожалуйста, поправьте меня, если я ужасно ошибаюсь! –
@ nathan-taylor, вы правы, ServiceController намного чище, я могу переключиться на это на более позднем этапе. – Boinst