2010-10-15 111 views
1

如何使用WMI从.NET代码启动,停止和查询本地计算机上的服务? (我正在使用C#)如何使用.NET中的WMI启动和停止服务?

我发现good and accurate answers使用ServiceController类来做到这一点,但我想如果可以的话使用WMI。

+1

*能* WMI做到这一点?使用ServiceController类有问题吗?当然WMI可以告诉你一个服务是一个正在执行的进程 - 从那里你可以开始()/终止()流程,但是这似乎是你跳过一个完全明显的抽象层,通过选择不使用ServiceController类。注意:如果我在这里可怕的错误,请纠正我! – 2010-10-15 00:36:24

+0

@ nathan-taylor,你说得对,ServiceController要干净得多,我可能会在后期切换到这个状态。 – Boinst 2010-10-15 02:12:43

回答

4

如果您希望在更直观的ServiceController类中使用WMI,请参见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; 
     } 
    } 
} 
+0

感谢Steve,CodeProject上的代码完全符合我的要求。 – Boinst 2010-10-15 02:10:36