Подтвердить что ты не робот

Остановить/запустить сервис в коде в Windows 7

Я пытаюсь написать приложение и службу, которые контролируют данный набор сервисов и a) убеждаются, что они запущены, и b) на основе определенных критериев, перезапустите их по мере необходимости.

Я продолжаю работать с ошибкой, запрещенной доступом.

Если я просто перебираю процессы в системе, найдите тот, который я хочу так:

foreach (ServiceController sc in ServiceController.GetServices())
   {                
       if(sc.ServiceName == "MyServiceName")
       {
            sc.Stop();
            sc.WaitForStatus(ServiceControllerStatus.Stopped, new TimeSpan(0, 0, 60));
            sc.Start(); 
       }            
   }   

Я получаю:

InnerException: System.InvalidOperationException
        Message="Cannot open My Service service on computer '.'."
        Source="System.ServiceProcess"
        StackTrace:
             at System.ServiceProcess.ServiceController.GetServiceHandle(Int32 desiredAccess)
             at System.ServiceProcess.ServiceController.Stop()
             at lib.ListServices() in D:\lib.cs:line 552
             at lib.Init() in D:\lib.cs:line 56
   InnerException: System.ComponentModel.Win32Exception
             Message="Access is denied"
             ErrorCode=-2147467259
             NativeErrorCode=5
             InnerException: 

Я попытался выдавать себя за пользователя, я попытался сделать тот же код из другой службы, которая работает как системная служба. Ни один из них не смог повлиять на обслуживание. Если он начнется, я не могу его остановить. Если его остановить, я не могу его запустить. Я знаю, что все это связано с разрешениями. Я просто не нахожу механизм, который фактически позволяет мне управлять сервисом.

Любая помощь будет принята с благодарностью.

4b9b3361

Ответ 1

Я думаю, что это ошибка UAC... Попробуйте запустить exe правой кнопкой мыши и "Запуск от имени администратора". Если это поможет, вы можете добавить файл манифеста в свой исполняемый проект с помощью level = "requireAdministrator".

Ответ 2

Диагнозы:


UAC действительно является проблемой. Ваше приложение требует повышенных прав пользователя. Вот почему "работать как администратор" работает вне IDE.

Некоторые сайты предлагают отключить UAC. Поскольку это не возможно в моей среде, я решил запросить прав пользователя с помощью кода. Wikipedia предоставил необходимую мне помощь. Раздел "Запрос высоты" предоставляет решение.

Краткое решение:


Измените файл манифеста приложения, чтобы он соответствовал вашим требованиям.


1,1. Щелкните правой кнопкой мыши ваш проект
1.2. Нажмите "Свойства"
1.3. Выберите вкладку "Приложение" - страница по умолчанию
1.4. Нажмите "Просмотреть настройки UAC". Эта кнопка открывает файл манифеста приложения (app.manifest)
1,5. Найдите раздел "Параметры манифеста UAC"
1.6. Удалить или прокомментировать текущую запись - {requestExecutionLevel level = "asInvoker" uiAccess = "false" }
1.7. Изменить на {requestExecutionLevel level = "requireAdministrator" uiAccess = "false" }. MS предоставляет ваши 3 варианта как часть комментария к разделу.

Ответ 3

Может ли быть политика безопасности .net, которая запрещает вашему приложению контролировать службу?

Согласно MSDN, ваша сборка нуждается в полном доверии для этого.

Ответ 4

Вы должны настроить приложение на выполнение как администратор. Если вы посмотрите в меню свойств файлов. На вкладке совместимости есть параметр Privilige Level, позволяющий программе запускаться как администратор. Он работал с моими системными лотками в Windows 7.