查询 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 年过去了)。

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

这是我

决定使用的代码中最相关的部分......谢谢大家的帮助!

    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>

div class="answers">

将引用添加到 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.");