Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 查询Windows服务是否已禁用(不使用注册表)?_C#_Service_Registry - Fatal编程技术网

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

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

是否有.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年过去了)。

使用
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
中的服务,当我尝试迭代
结果时,上面的代码永远挂起。