Как я могу позволить приложению Windows Forms перезапустить службу Windows независимо от разрешений? - PullRequest
0 голосов
/ 21 марта 2012

Дизайн текущего приложения, над которым я работаю, обращается к службе WCF, размещенной в службе Windows, которая извлекает данные и сохраняет их на жестком диске. Он соединяется с приложением форм Windows, которое будет взаимодействовать со службой WCF. Одно из требований заключается в том, чтобы конечный пользователь мог перезапустить службу Windows через приложение Forms.

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

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

НО я не хочу добавлять столько сложности в проект, тем более что он должен был быть в бета-версии на прошлой неделе.

Так есть ли способ, которым я могу просто дать приложению Forms необходимые разрешения для перезапуска конкретной службы-компаньона?

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

Да, и следует отметить, что целевыми платформами являются WinXP и Win7 с .NET4.

Ответы [ 2 ]

1 голос
/ 21 марта 2012

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

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

Вы можете установить дескриптор безопасности службы, используя команду sc sdset <serviceName>. Например, эта команда позволит любому пользователю контролировать службу (но только администраторам и локальной системе разрешено удалять службу или изменять безопасность службы):

sd sdset <myservice> "D:(A;;CCLCSWRPWPDTLOCRSDRC;;;AU)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;SY)"

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

0 голосов
/ 21 марта 2012

Как насчет того, чтобы служба отвечала за перезапуск? Это может раскрыть метод, Restart(string userId, string password) или что-то подобное.

При вызове авторизованным пользователем он может использовать подход, описанный в этом ответе . То есть:

  1. Настройка перезапуска службы при ошибке
  2. Звоните Environment.Exit(1)
  3. ОС перезапускает службу для вас.

Вы бы позвонили Environment.Exit(0), если не хотите перезапускаться.

...