#c_sharp #windows_service
Всем привет. Написал службу, в которой код рабочий. Пытаюсь запустить: ServiceController sc = new ServiceController("Service_1"); sc.Refresh(); try { if (sc.Status == ServiceControllerStatus.Stopped) { sc.Start(); } for (int i = 0; i < 100; ++i) { Thread.Sleep(100); sc.Refresh(); if (sc.Status == ServiceControllerStatus.Running) { break; } } } catch (Exception ex) { MessageBox.Show(ex.Message); } Выдает сообщение "Не удалось открыть службу Service_1 на компьютере". Вручную в службах запускаю и останавливаю эту службу. Все работает. Но программно не могу запустить. ServiceName = "Service_1". Помогите разобраться почему не запускается служба программно?
Ответы
Ответ 1
По-умолчанию, управлять службами может только пользователь с правами администратора. Начиная с Windows Vista, даже такому пользователю, необходимо явно указывать, что он хочет воспользоваться своими правами при запуске приложения и других действиях. Таким образом, вашей программе просто не хватает прав для управления службой. Вариантов у вас два: Запуск приложения с повышенными привилегиями, при их наличии разумеется. Как именно сделать запрос на повышение прав за рамками данного вопроса и где-то тут на него уже отвечали, вроде как не единожды. Недостаток: необходимо выдать пользователю права администратора, как бывший администратор - категорически не одобряю такой подход, если это не служебная программа для администраторов. Явно выдать права пользователю приложения на управление конкретной службой. Правда, как обычно, все самое нужное у Microsoft настраивается странно и не очевидно. 2.1. Стандартная утилита SC.exe + зубодробительный синтаксис дескрипторов безопасности (см. sc sdset). 2.2. Дополнительная утилита SubInACL – официальная документация поставляется вместе с утилитой. Переведенная документация - качество перевода я не проверял, но, в любом случае, спасибо автору за проделанную работу. Утилита требует осторожного обращения, т.к. позволяет настраивать права доступа на все, или почти на все, объекты системы, от файлов, до реестра. 2.3. Для версий ниже Windows Pro - шаблоны безопасности. Этот вариант применим и к более старшим версиям, но в старших проще использовать групповые политики. Создаем новый шаблон, настраиваем права на службу в разделе System Services (Системные службы) и применяем шаблон. Про создание и применение шаблонов подробно уже писал тут 2.4. Для версий Windows Pro и выше - групповые политики. Через групповые политики можно все, или почти все, поэтому редактор включен в поставку только старших версий. Вам понадобится gpedit.msc. Далее можете отредактировать локальную политику или одну из доменных. если у вас есть домен. В разделе Computer configuration -> Windows Settings -> Security Settings -> System Services находим нужную службу и настраиваем права доступа. 2.5. Сторонняя утилита Service Security Editor, но ее сам не пробовал. Возможно есть и другие. Также, можете почитать эту статью, там все по шагам и с картинками, кроме последнего пункта.
Комментариев нет:
Отправить комментарий