查询 Windows 服务是否已禁用(不使用注册表)
本文关键字:注册表 Windows 服务 是否 查询 | 更新日期: 2023-09-27 18:32:47
是否有可用于查询Windows服务是否禁用的.NET (C#)方法或API调用?相关的 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<</p>
将引用添加到 System.Management,以下代码将为您提供启动模式
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。有关详细的解决方案
WMI可以是查询Windows Services状态的另一种方法
您可以使用:
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";
例如,要检查正在运行的状态:
if (TheServiceName.Status == ServiceControllerStatus.Running)
MessageBox.Show("The service is running.");