0

ワークステーションにインストールされているすべてのサービスを取得する Windows サービスがあります。ここで、特定のサービスの実行可能ファイルの場所を取得したいと考えています。パスは絶対パスである必要があります。どうすればプログラムでそれを達成できますか?

4

2 に答える 2

3

.net インターフェイスについてはよくわかりませんが、各サービスのレジストリ値を読み取る方法が見つからない場合: LocalMachine/System/CurrentControlSet/Services/ SERVICENAME を示し、ImagePath キーにアクセスする必要があります。フル パス (絶対パスでない場合、ベース パスは Windows ホーム フォルダーです)

私もその例を見つけました: http://bytes.com/topic/c-sharp/answers/268807-get-path-install-service

于 2012-06-06T10:25:39.647 に答える
0

最近これが必要になり、これが私が作成したものです。与えられたこのコードでは、一致をチェックしますimagePathが、返すように簡単に変更でき、imagePathすでに一致するサービス名を返しています。このループで{foreach (string keyName...}をチェックしてkeyNameを返すことができimagePathます。魔法のように機能しますが、セキュリティとユーザー アクセスに関する考慮事項があることを覚えておいてください。ユーザーがアクセス権を持っていない場合、失敗する可能性があります。私のユーザーは「管理者として」それを実行します。この意味では問題はありません

// currPath - full file name/path of the exe that you trying to find if it is registered as service
// displayName - service name that you return if you find it
private bool TryWinRegistry(string currPath, out string displayName)
{
    displayName = string.Empty;

    try
    {
        using (RegistryKey regKey = Registry.LocalMachine.OpenSubKey("SYSTEM\\CurrentControlSet\\services", false))
        {
            if (regKey == null)
                return false;

         // we don't know which key because key name is configured by config file and equals to service name
            foreach (string keyName in regKey.GetSubKeyNames())
            {
                try
                {
                    using (RegistryKey serviceRegKey = regKey.OpenSubKey(keyName))
                    {
                        if (serviceRegKey == null)
                            continue;

                        string val = serviceRegKey.GetValue("imagePath") as string;
                        if (val != null && String.Equals(val, currPath, StringComparison.OrdinalIgnoreCase))
                        {
                            displayName = serviceRegKey.GetValue("displayName") as string;
                            return true;
                        }

                    }
                }
                catch
                {
                }

            }
        }
    }
    catch
    {
        return false;
    }

    return false;
}
于 2016-11-02T14:56:01.453 に答える