Назад | Перейти на главную страницу

Как предоставить разрешения на запуск / остановку / перезапуск службы произвольному пользователю или группе на сервере, не являющемся членом домена?

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

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

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

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

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

Мы работаем с этим на Server 2003 и Server 2008, поэтому любые идеи и указания будут приняты нами!


Уточнение: Я не хочу предоставлять возможность запускать / останавливать / перезапускать ВСЕ службы для данного пользователя или группы - я хочу иметь возможность предоставить разрешение на это конкретный только сервисы для данного пользователя или группы.


Дальнейшее уточнение: Серверы, которым мне нужно предоставить эти разрешения, не принадлежат домену - это два сервера с выходом в Интернет, которые получают файлы, обрабатывают их и отправляют их третьим сторонам, а также обслуживают несколько веб-сайтов, поэтому группа Active Directory Политика невозможна. Извините, что я не уточнил это.

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

Я не понял, что означает строковое представление в статье базы знаний, но немного покопавшись, я обнаружил, что это синтаксис SDDL. Дальнейшие поиски привели меня к эта статья Алан Джонс в котором объясняется, как получить дескриптор безопасности для службы и что означает каждый бит. MS KB914392 есть более подробная информация.

Чтобы добавить к существующему дескриптору безопасности службы, используйте sc sdshow "Service Name" чтобы получить существующий дескриптор. Если это простая старая служба .NET Windows - как в случае с нашей - дескриптор безопасности должен выглядеть примерно так:

D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOC
RRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)(A;;CR;;;AU)(A;;CCLCSWRPWPDTLOCRRC;;;PU)S:(AU;FA
;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)

Нам нужно было предоставить разрешения RP (для запуска службы), WP (чтобы остановить службу), DT (чтобы приостановить / продолжить обслуживание) и LO (чтобы запросить текущий статус службы). Это можно сделать, добавив нашу учетную запись службы в группу опытных пользователей, но я хочу предоставить индивидуальный доступ только той учетной записи, под которой работает служба обслуживания.

С помощью runas чтобы открыть командную строку под учетной записью службы, я запустил whoami /all который дал мне SID учетной записи службы, а затем построил дополнительный SDDL ниже:

(A;;RPWPDTLO;;;S-x-x-xx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxx-xxxx)

Затем это добавляется к D: раздел строки SDDL выше:

D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOC
RRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)(A;;CR;;;AU)(A;;CCLCSWRPWPDTLOCRRC;;;PU)(A;;RPWP
DTLO;;;S-x-x-xx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxx-xxxx)S:(AU;FA;CCDCLCSWRPWPDTLOC
RSDRCWDWO;;;WD)

Затем это применяется к службе с помощью sc sdset команда (до S: текст):

sc sdset "Service Name" D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;
CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)(A;;CR;;;AU)(A;;CCLCSWRPWPDTLOCRRC;;;PU
)(A;;RPWPDTLO;;;S-x-x-xx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxx-xxxx)S:(AU;FA;CCDCLCSW
RPWPDTLOCRSDRCWDWO;;;WD)

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

У меня была такая же проблема.
Вы могли бы использовать SubInACL.exe из набора ресурсов. Загрузите автономную утилиту здесь: http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=23510

Использовать msiexec /a PathToMSIFile /qb TARGETDIR=DirectoryToExtractTo для извлечения файлов, если вы не хотите устанавливать .msi

  1. Откройте командную строку как Администратор
  2. Перейдите в каталог, в который вы поместили .exe
  3. Бегать subinacl /service SERVICE_NAME /grant=COMPUTER_NAME\USERNAME=TOP

T = Запуск службы
O = Остановить службу
P = Приостановить / продолжить обслуживание

Полная ссылка: Как предоставить пользователям права на управление службами в Windows 2000
или введите subinacl /help

Примечание: не пытайся subinacl /service SERVICE_NAME /perm так как это может привести к неприятностям (усвоенный урок: P). Имя может вводить в заблуждение (perm! = Разрешение), поскольку оно удаляет все разрешения для всех пользователей (даже для администратора!).

Вы ищете Конфигурация компьютера - Политики - Параметры Windows - Параметры безопасности - Системные службы

Здесь вы можете не только определить тип запуска службы, но и настроить списки управления доступом для каждой службы. По умолчанию в интерфейсе будут перечислены только службы, установленные на компьютере, на котором запущен редактор GP.

Чтобы добавить службы, существующие только на другом компьютере:

  • экспортировать регистрационный ключ службы с другого компьютера
  • импорт на машину gpedit
  • применять политику
  • удалить импортированный ключ

Я использовал SubinAcl (как было предложено patrx), чтобы иметь возможность запускать MySQL как обычный пользователь домена (не как администратор), и он отлично работает! (однако команда должна выполняться как -local по крайней мере- Admin)

Команда такая:

[PATH_TO_SUBACL]\subinacl.exe /service MySQL /grant=[Domain User - Without domain]=TOP

Просто обратите внимание, что я ввел пользователя без префикса домена ... иначе команда не удастся выполнить команду синтаксического анализа!