C# 查询Windows服务是否已禁用(不使用注册表)?
是否有.NET(C#)方法或API调用可用于查询Windows服务是否已禁用?相关MSDN文章 我希望避免直接查询注册表。下面是我现在正在使用的一些代码(它是有效的)。然而,我正在寻找一些更优雅,更少侵入性的东西C# 查询Windows服务是否已禁用(不使用注册表)?,c#,service,registry,C#,Service,Registry,是否有.NET(C#)方法或API调用可用于查询Windows服务是否已禁用?相关MSDN文章 我希望避免直接查询注册表。下面是我现在正在使用的一些代码(它是有效的)。然而,我正在寻找一些更优雅,更少侵入性的东西 const String basepathStr = @"System\CurrentControlSet\services\"; String subKeyStr = basepathStr + servicenameStr; using (RegistryKey key = Re
const String basepathStr = @"System\CurrentControlSet\services\";
String subKeyStr = basepathStr + servicenameStr;
using (RegistryKey key = Registry.LocalMachine.OpenSubKey(subKeyStr))
{
return (int) key.GetValue("Start");
}
我确实找到了一个更好的答案,但我希望得到一个更好的答案,因为答案可能已经过时了(3年过去了)。使用
ServiceController
类获取有关服务的信息
编辑使用
ServiceController
似乎有一件事是无法获取启动类型。谷歌显示了以下博客文章,其中包含使用P/Invoke获取服务启动类型的代码:WMI可以是查询windows服务状态的另一种方法,您可以使用:
using System.ServiceProcess;
然后通过以下方式链接要查看SATU的服务:
// 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.");
向System.Management添加一个ref,下面的代码将为您提供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。有关详细的解决方案,请参见这是我决定使用的代码中最相关的部分…谢谢大家的帮助
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
以及一些本机调用来获取所需内容的信息,而无需访问注册表。如果该服务没有运行,那么该代码应该如何告诉您它是否被禁用?你知道,并非所有未运行的服务都被禁用。为什么要循环结果?当然只能安装一个带有YourServiceName
的服务?在我的WPF项目中,它控制自定义ServiceModel
中的服务,当我尝试迭代结果时,上面的代码永远挂起。