Запуск и остановка службы Windows из роли обычного пользователя - PullRequest
0 голосов
/ 10 марта 2019

В моем случае у меня есть приложение 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 программно с обычными привилегиями пользователя.

1 Ответ

0 голосов
/ 10 марта 2019

Не уверен, что это работает для не-администратора.

            ConnectionOptions options = new ConnectionOptions();

            ManagementScope scope = new ManagementScope(@"\\servername\root\cimv2", options);
            scope.Connect();

            ObjectQuery query = new ObjectQuery("SELECT * FROM Win32_Service");
            ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);

            ManagementObjectCollection queryCollection = searcher.Get();

            foreach (ManagementObject m in queryCollection)
            {

                    if (m["Started"].Equals(true))
                    {
                        m.InvokeMethod("StopService", null);
                    }

            }
...