Остановка / запуск службы в коде в Windows 7 - PullRequest
20 голосов
/ 09 октября 2009

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

Я продолжаю сталкиваться с ошибкой в ​​доступе.

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

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: 

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

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

Ответы [ 4 ]

11 голосов
/ 24 ноября 2010

Диагнозы:


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

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

Решение вкратце:


Отредактируйте файл манифеста приложения в соответствии с вашими требованиями.


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

10 голосов
/ 17 октября 2009

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

0 голосов
/ 03 ноября 2009

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

0 голосов
/ 09 октября 2009

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

Согласно MSDN вашей сборке необходимо полное доверие, чтобы это работало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...