У нас есть набор служб 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
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.
Чтобы добавить службы, существующие только на другом компьютере:
Я использовал SubinAcl (как было предложено patrx), чтобы иметь возможность запускать MySQL как обычный пользователь домена (не как администратор), и он отлично работает! (однако команда должна выполняться как -local по крайней мере- Admin)
Команда такая:
[PATH_TO_SUBACL]\subinacl.exe /service MySQL /grant=[Domain User - Without domain]=TOP
Просто обратите внимание, что я ввел пользователя без префикса домена ... иначе команда не удастся выполнить команду синтаксического анализа!