发现任何Windows服务的安装目录

时间:2012-06-06 10:08:14

标签: c# service

我有一个Windows服务,可以在工作站上获取所有已安装的服务。现在我想获取特定服务的可执行文件的位置。路径必须是绝对的。我怎样才能以编程方式实现?

2 个答案:

答案 0 :(得分:3)

我不太了解.net界面但是如果找不到办法可以读取每项服务的注册表值:LocalMachine / System / CurrentControlSet / Services / SERVICENAME < / EM> 然后你需要访问显示完整路径的ImagePath键(如果不是绝对的话,那么基本路径就是windows主文件夹)

我也找到了一个例子:http://bytes.com/topic/c-sharp/answers/268807-get-path-install-service

答案 1 :(得分:0)

我最近需要这个,这就是我创造的。给定,在此代码中我检查匹配imagePath但是可以很容易地修改它以返回imagePath并且它已经返回匹配服务名称。您可以在此循环中{foreach (string keyName...}检查keyName并返回imagePath。像魅力一样工作但记住会有安全性和用户访问注意事项。如果用户无法访问,则可能会失败。我的用户运行它&#34;作为管理员&#34;,在这个意义上我没有问题

// 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;
}