查询是否禁用了Windows服务(不使用注册表)?

是否有.NET(C#)方法或API调用,我可以用来查询Windows服务是否被禁用? 相关的MSDN文章在这里 。

我想避免直接查询注册表。 下面是我现在正在使用的一些代码(并且它可以工作)。 然而,我正在寻找更优雅,更少侵入性的东西。

const String basepathStr = @"System\CurrentControlSet\services\"; String subKeyStr = basepathStr + servicenameStr; using (RegistryKey key = Registry.LocalMachine.OpenSubKey(subKeyStr)) { return (int) key.GetValue("Start"); } 

我确实找到了一个简短的问题,但我希望得到一个更好的答案,因为答案可能已经过时(3年过去了)。

这是我决定使用的代码中最相关的部分…感谢所有人的帮助!

  StartupState state = StartupState.Unknown; try { PermissionSet fullTrust = new PermissionSet(System.Security.Permissions.PermissionState.Unrestricted); fullTrust.Demand(); string wmiQuery = @"SELECT * FROM Win32_Service WHERE Name='" + servicenameStr + @"'"; ManagementObjectSearcher searcher = new ManagementObjectSearcher(wmiQuery); ManagementObjectCollection results = searcher.Get(); foreach (ManagementObject service in results) { if (service["StartMode"].ToString() == "Disabled") state = StartupState.Disabled; else state = StartupState.Enabled; } return state; } catch (SecurityException se) { return StartupState.Refused; } catch (Exception e) { return StartupState.Error; } 

使用ServiceController类获取有关服务的信息。

编辑
似乎使用ServiceController无法做的事情之一是获取启动类型。 谷歌搜索显示以下博客文章,其中包含使用P / Invoke获取服务启动类型的代码: http : //peterkellyonline.blogspot.de/2011/04/configuring-windows-service.html

WMI可以是查询Windows服务状态的另一种方式

添加一个ref到System.Management,以下代码将为您提供StartMode

  string wmiQuery = "SELECT * FROM Win32_Service WHERE Name='YourServiceName'"; var searcher = new ManagementObjectSearcher(wmiQuery); var results = searcher.Get(); foreach (ManagementObject service in results) { Console.WriteLine(service["StartMode"]); } 

ServiceController类不提供此信息。 你应该使用WMI。 请参阅此处获取详细解决方

您可以使用:

 using System.ServiceProcess; 

然后通过以下方式链接您要查看的服务:

 // Link by service name ServiceController TheServiceName = new ServiceController(); TheServiceName.ServiceName = "Spooler"; // Link by display name ServiceController TheDisplayName = new ServiceController(); TheDisplayName.ServiceName = "Print Spooler"; 

要检查例如isRunning状态:

 if (TheServiceName.Status == ServiceControllerStatus.Running) MessageBox.Show("The service is running.");