6

是否有可用于查询 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 年过去了)。

4

6 回答 6

7

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

    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;
    }
于 2012-05-01T14:43:35.153 回答
3

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

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

于 2012-04-30T13:14:50.040 回答
0

向 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"]);
        }
于 2012-04-30T13:25:17.410 回答
0

ServiceController 类不提供此信息。您应该使用 WMI。详细解决方法见这里

于 2012-04-30T13:30:16.110 回答
-1

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

于 2012-04-30T13:21:31.403 回答
-3

您可以使用:

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.");
于 2012-04-30T13:23:18.407 回答