从services.msc c#获取服务路径

时间:2013-04-18 08:27:44

标签: c# service servicecontroller

我正在尝试从services.msc

获取服务可执行文件路径

我写了下一段代码:

  var service = ServiceController.GetServices().Where(p => p.ServiceName.Equals("Service name", StringComparison.InvariantCultureIgnoreCase));
if (service.Any())
//get service data

我无法找到服务可执行路径所在的位置(如果有的话)?

在services.msc中我可以看到路径,所以我假设它也可以通过代码获取它。 Example of service info in services.msc (see that executable path exists there)

任何想法?

3 个答案:

答案 0 :(得分:6)

你可以从注册表中获取它:

private static string GetServiceInstallPath(string serviceName)
{
    RegistryKey regkey;
    regkey = Registry.LocalMachine.OpenSubKey(string.Format(@"SYSTEM\CurrentControlSet\services\{0}", serviceName));

    if (regkey.GetValue("ImagePath") == null)
        return "Not Found";
    else
        return regkey.GetValue("ImagePath").ToString();
}

答案 1 :(得分:0)

您可以使用WMI获取有关您的服务(本地或远程服务)的完整信息

检查(Services+ on CodePlex)的代码,了解如何使用WMI

答案 2 :(得分:0)

@ ChirClayton代码的简化版本:

public string GetServiceInstallPath(string serviceName) => (string) Registry.LocalMachine.OpenSubKey($@"SYSTEM\CurrentControlSet\services\{serviceName}").GetValue("ImagePath");

它没有修剪可能的服务参数。如果不需要,您可以使用以下内容:

public string GetServiceInstallPath(string serviceName) 
{
    var imagePath = (string) Registry.LocalMachine.OpenSubKey($@"SYSTEM\CurrentControlSet\services\{serviceName}").GetValue("ImagePath");
    if (string.IsNullOrEmpty(imagePath))
        return imagePath;
    if (imagePath[0] == '"')
        return imagePath.Substring(1, imagePath.IndexOf('"', 1) - 1);
    var indexOfParameters = imagePath.IndexOf(' ');
    if (indexOfParameters >= 0)
        return imagePath.Remove(indexOfParameters);
    return imagePath;
}