В моем случае у меня есть приложение WPF, которое отвечает за взаимодействие с пользователем, и за ним запущена вспомогательная служба Windows.
Я должен запускать приложение WPF только с правами обычного пользователя (без прав администратора).).Поскольку приложение должно запускать и останавливать службы Windows, я получил исключения «УРОВЕНЬ ДОСТУПА».
Я пытался использовать класс ServiceController
, чтобы остановить службу,
public bool StopLibraryService()
{
try
{
var service = new ServiceController(ServiceName);
if (service.Status == ServiceControllerStatus.Running)
{
service.Stop();
var timeout = new TimeSpan(0, 0, 5); service.WaitForStatus(ServiceControllerStatus.Stopped, timeout);
if (service.Status != ServiceControllerStatus.Stopped)
throw new Exception($"Failed in stopping service {ServiceName}");
}
}
catch (InvalidOperationException exAccess)
{
throw;
}
catch (Exception exception)
{
}
return true;
}
Если приложение WPF открыто как администратор, эта часть кода выполняется правильно.
В том же решении есть отдельный проект библиотеки классов, который отвечает за доступ к службе Windows, я попытался добавить app.Manifest
файл и измените роль на <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
Поскольку это библиотечный проект, я не видел никакого эффекта от его использования.
Кроме того, я пытался использовать Process
,
var info = new ProcessStartInfo(path)
{
CreateNoWindow = true,
UseShellExecute = false,
Arguments = command,
WindowStyle = ProcessWindowStyle.Hidden,
Verb = "runas"
};
Process.Start(info);
но это только для запуска процесса, оно может быть бесполезным для меня.
В качестве альтернативы я решил написать консольное приложение для управления состоянием службы Windows, и в манифесте яустановите уровень requestedExecutionLevel
как requireAdministrator
, включите его в решение и вызовите его.(я получаю UAC каждый раз, когда выполняется код) Я не верю, что это лучший способ следовать.
Есть ли лучший способ остановить и запустить службу Windows программно с обычными привилегиями пользователя.