查询是否禁用了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.");