Вопрос по c#, service – Запросить, если служба Windows отключена (без использования реестра)?

6

Есть ли метод .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 года).

Ваш Ответ

5   ответов
3

ИспользоватьServiceController класс для получения информации об услугах.

EDIT
Кажется, что вы не можете сделать сServiceController это получить тип запуска. Googling показал следующий пост в блоге, в котором есть код, использующий P / Invoke для получения типа запуска службы:http://peterkellyonline.blogspot.de/2011/04/configuring-windows-service.html

Error: User Rate Limit Exceededmsdn.microsoft.com/en-us/library/…Error: User Rate Limit Exceeded Timothy John Laird
Error: User Rate Limit ExceededServiceControllerError: User Rate Limit Exceeded
0

WMI может быть другим способом для запроса статуса служб Windows

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;
    }
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"]);
        }
Error: User Rate Limit ExceededServiceModelError: User Rate Limit Exceededresults.
Error: User Rate Limit ExceededYourServiceNameError: User Rate Limit Exceeded
0

Класс ServiceController не предоставляет эту информацию. Вы должны использовать WMI. УвидетьВот для подробного решения

Похожие вопросы