Есть ли способ получить путь к исполняемому файлу работающей службы Windows, не требуя прав администратора на уровне выполнения в .Net? (Не заставляя UAC получать подтверждение пользователя)
Как получить путь к исполняемому файлу службы
Ответы (2)
Вот возможное решение с использованием WMI:
using System.Management;
String query = String.Format("SELECT PathName FROM Win32_Service WHERE Name = '{0}'", serviceName);
using (ManagementObjectSearcher mos = new ManagementObjectSearcher(query)) {
foreach(ManagementObject mo in mos.Get())
Console.WriteLine(mo["PathName"].ToString());
}
Не забудьте заключить ManagementObjectSearcher
в блок using
, потому что это ресурс, и от него нужно правильно избавиться.
Я не уверен, что для этого требуются повышенные разрешения, но для этого требуется, чтобы WMI был установлен и запущен на машине. Чтобы проверить, запущен ли WMI, откройте оснастку служб и найдите инструментарий управления Windows. Вы также можете включить его, запустив net start winmgmt
из командной строки.
person
Paccc
schedule
27.01.2012
Я получаю исключение Invalid query на mos.Get()
- person Lost_In_Library; 08.04.2013
@LostInLib Мои извинения ... Я забыл заключить имя службы в одинарные кавычки. Я обновил свой ответ, чтобы отразить это изменение. :)
- person Paccc; 08.04.2013
Попробуйте получить из реестра:
using Microsoft.Win32;
.
.
.
RegistryKey hklm = Registry.LocalMachine;
hklm = hklm.OpenSubKey(@"System\CurrentControlSet\Services\SERVICE_NAME");
string servicePath = hklm.GetValue("ImagePath");
person
Zanoni
schedule
25.06.2009
Для чтения формы реестра требуется привилегированный уровень исполнения администратора. Не так ли?
- person mrtaikandi; 25.06.2009
Хотя это не идеальный способ получить эту информацию, я вернулся к нему, как и выше, но с несколькими изменениями, которые я только что сделал. Требуется тестирование, чтобы узнать об этом в приглашении UAC, но я полагаю, что почти любой пользователь может беспрепятственно запросить эту часть реестра.
- person Saxar; 18.07.2015