Как создать Службу Windows через другую Службу Windows - PullRequest
1 голос
/ 23 августа 2011

У меня проблемы с приложением, которое я разрабатываю.Вот сценарий: у меня есть две службы Windows (служба A и служба B), написанные на C #.

Служба A отвечает за передачу данных между двумя приложениями (с использованием веб-служб, FTP-соединений и т. Д.).Он также отвечает за обновление службы B.

Служба B отвечает за обновление службы A и обновление веб-приложения.

Основная операция обновлений заключается в (допустим, это процесс обновления службыA, выполняется службой B):

  1. Проверка обновлений через WebServices
  2. Если есть новая версия, остановите службу (используя C # ServiceController).
  3. Резервное копирование текущих файлов службы (чтобы я мог выполнить откат, если что-то пойдет не так)
  4. Удаление службы (с помощью команды sc delete)
  5. Загрузка обновленных файлов службы (с использованием FTP-соединения).)
  6. Выполнение некоторых сценариев SQL Server, если они существуют
  7. Установка службы Windows (с помощью команды sc create)
  8. Запуск службы (с помощью C # ServiceController)

Все идет гладко до шага 7. Я понял, что проблема в том, что пользователь, выполняющий обновление (пользователь, запускающий Службу B), не имеет прав для создания новых окон Windows.пороки, поэтому SC Create всегда возвращает что-то вроде «[SC] OpenSCManager FAILED 5: Доступ запрещен». Обратите внимание, что у меня были обе службы, работающие с учетной записью LocalSystem.Итак, я решил, что эта учетная запись не может создавать новые службы Windows (поправьте меня, если я ошибся).

После этого я создал нового пользователя Windows, просто для запуска служб.Идея заключалась в том, чтобы дать этому пользователю необходимые разрешения (для общего доступа к сети, файлов и создания служб).Однако этот пользователь по-прежнему не может создать службу.

Вот что я пробовал:

  1. Предоставьте пользователю полномочия cmd.exe и sc.exe (с использованием CACLS).
  2. Используйте PsExec для непосредственного запуска cmd (с -i -s) вместо cmd.exe.
  3. С помощью команды SubInAcl , чтобы пользователь имел права доступа к обоим WindowsОбслуживание.Но в том-то и дело, что в то время у меня нет Службы, поэтому она не работает.

Некоторые замечания:

  • Эти Службы Windows неесть любой установщик.
  • Команда SC запускается с использованием C # ProcessStartInfo.
  • Команда SC указывает имя пользователя и пароль пользователя Windows, которого я создал.
  • Я действительно не могухочу, чтобы службы Windows запускались под учетной записью пользователя с правами администратора.

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

Извините за длинный текст

1 Ответ

2 голосов
/ 23 августа 2011

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

Я бы сделал так, чтобы любой сервис, который нуждается в обновлении на месте, мог сделать это сам по себе.В основном поместите весь код, который подлежит обновлению, в DLL.Код в служебном EXE-файле - это всего лишь тонкий хост, отвечающий за загрузку основной библиотеки DLL и запуск ее основного цикла обработки.Когда EXE-файл определяет, что пришло время для обновления, он загружает новую DLL, предположительно проверяя с помощью хэша, что он загрузил правильно.Затем цикл обработки прерывается, старая DLL выгружается, новая DLL загружается и цикл обработки запускается снова.

Этот подход гораздо менее навязчив и позволяет избежать всех проблем с правами и правами.Вы можете написать один EXE-файл узла службы и иметь несколько библиотек DLL, содержащих логику.

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