найти фактический исполняемый файл и путь, связанный с Windows-сервисом, используя c # - PullRequest
8 голосов
/ 22 марта 2012

Я работаю над программой установки для одного из продуктов моей компании. Продукт может быть установлен несколько раз, и каждая установка представляет отдельную службу Windows. Когда пользователи обновляют или переустанавливают программу, я хотел бы найти запущенные службы, найти службы, принадлежащие продукту, а затем найти исполняемый файл и путь к нему для этой службы. Затем используйте эту информацию, чтобы узнать, какую из служб пользователь хочет обновить / заменить / установить / и т. Д. В приведенном ниже примере кода я вижу имя службы, описание и т. Д., Но не вижу фактического имени файла или пути. Может кто-нибудь сказать мне, что мне не хватает? Заранее спасибо!

Код, который я имею, выглядит следующим образом:

        ServiceController[] scServices;
        scServices = ServiceController.GetServices();

        foreach (ServiceController scTemp in scServices)
        {
            if (scTemp.ServiceName == "ExampleServiceName")
            {
                Console.WriteLine();
                Console.WriteLine("  Service :        {0}", scTemp.ServiceName);
                Console.WriteLine("    Display name:    {0}", scTemp.DisplayName);

                ManagementObject wmiService;
                wmiService = new ManagementObject("Win32_Service.Name='" + scTemp.ServiceName + "'");
                wmiService.Get();
                Console.WriteLine("    Start name:      {0}", wmiService["StartName"]);
                Console.WriteLine("    Description:     {0}", wmiService["Description"]);
            }
        }

Ответы [ 2 ]

11 голосов
/ 22 марта 2012

Я могу ошибаться, но класс ServiceController не предоставляет эту информацию напрямую.

Так что, как предлагает Джин, вам придется использовать реестр или WMI.

Пример использования реестра см. В http://www.codeproject.com/Articles/26533/A-ServiceController-Class-that-Contains-the-Path-t

Если вы решите использовать WMI (что я бы предпочел),

ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_Service");
ManagementObjectCollection collection = searcher.Get();

foreach (ManagementObject obj in collection)
{    
    string name = obj["Name"] as string;
    string pathName = obj["PathName"] as string;
    ...
}

Выможет решить обернуть нужные вам свойства в классе.

1 голос
/ 10 августа 2018

интерфейс изменился после ответа @sidprasher, попробуйте:

var collection = searcher.Get().Cast<ManagementBaseObject>()
        .Where(mbo => mbo.GetPropertyValue("StartMode")!=null)
        .Select(mbo => Tuple.Create((string)mbo.GetPropertyValue("Name"), (string)mbo.GetPropertyValue("PathName")));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...