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サービスに関する情報を取得します。

EDIT
でできないことの 1 つはServiceController、スタートアップの種類を取得することです。グーグルは、P/ Invokeを使用してサービスのスタートアップの種類を取得するコードを含む次のブログ投稿を示しました。

于 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サービスのステータスをクエリするためのもう1つの方法です。

于 2012-04-30T13:21:31.403 に答える
-3

次を使用できます。

using System.ServiceProcess;

次に、satusを表示するサービスを次のようにリンクします。

// 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 に答える