По умолчанию обычные пользователи (без прав администратора) не могут управлять системными службами Windows. Это означает, что пользовали не могут остановить, запустить (перезапустить), изменить настройки и разрешения служб Windows. В этой статье мы разберем несколько способов управления правами на службы Windows. В частности, мы покажем, как предоставить обычному пользователю, без прав администратора Windows, права на запуск, остановку и перезапуск определенной службы.
Предположим, нам нужно предоставить доменной учетной записи contoso\tuser права на перезапуск службы печати (Print Spooler) с системным именем Spooler. При попытке перезапустить службу под пользователей появляется ошибка:
System error 5 has occurred. Access is denied.
Простого и удобного встроенного инструмента для управления разрешениями на службы в Windows нет. Мы рассмотрим несколько способ предоставления пользователю прав на службу:
- Управление правами на службы с помощью встроенной утилиты SC.exe (Service controller)
- Предоставление прав на перезапуск службы с помощью SubInACL
- Process Explorer: Установка разрешений на службу
- Назначаем разрешения на службу с помощью PowerShell
- Используем шаблоны безопасности (Security Templates) для управления разрешениями служб
- Управление правами служб через групповые политики
Какой из них проще и удобнее – решать Вам.
Управление правами на службы с помощью встроенной утилиты SC.exe (Service controller)
Стандартный, встроенный в Windows способ управления правами на службы системы предусматривает использование консольной утилиты sc.exe (Service Controller).
Главная, проблема – зубодробительный синтаксис формата предоставления прав на сервис (используется формат SDDL — Security Description Definition Language).
Получить текущие разрешения на службу в виде SDDL строки можно так:
sc.exe sdshow Spooler
D:(A;;CCLCSWLOCRRC;;;AU)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA) (A;;CCLCSWRPWPDTLOCRRC;;;SY)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)
Что значат все эти символы?
D: — Discretionary ACL (DACL)
Первая буква после скобок означает: разрешить (A, Allow) или запретить (D, Deny).
Следующая пачка символов – назначаемые права.
LC — SERVICE_QUERY_STATUS (опрос состояния служы)
SW — SERVICE_ENUMERATE_DEPENDENTS (опрос зависимостей)
LO — SERVICE_INTERROGATE
CR — SERVICE_USER_DEFINED_CONTROL
RC — READ_CONTROL
RP — SERVICE_START (запуск службы)
WP — SERVICE_STOP (остановка службы)
DT — SERVICE_PAUSE_CONTINUE (приостановка, продолжение службы)
Последние 2 буквы — объекты (группа пользователей или SID), котором нужно назначить права. Есть список предустановленных групп.
AO Account operators
RU Alias to allow previous Windows 2000
AN Anonymous logon
AU Authenticated users
BA Built-in administrators
BG Built-in guests
BO Backup operators
BU Built-in users
CA Certificate server administrators
CG Creator group
CO Creator owner
DA Domain administrators
DC Domain computers
DD Domain controllers
DG Domain guests
DU Domain users
EA Enterprise administrators
ED Enterprise domain controllers
WD Everyone
PA Group Policy administrators
IU Interactively logged-on user
LA Local administrator
LG Local guest
LS Local service account
SY Local system
NU Network logon user
NS Network service account
PO Printer operators
PS Personal self
PU Power users
RS RAS servers group
RD Terminal server users
RE Replicator
RC Restricted code
SA Schema administrators
SO Server operators
SU Service logon user
Можно вместо предустановленной группы явно указать пользователя или группу по SID. Получить SID пользователя для текущего пользователя можно с помощью команды:
whoami /user
или для любого пользователя домена с помощью PowerShell комаднлета Get-ADUser:
Get-ADUser -Identity 'iipeshkov' | select SID
SID доменной группы можно получить с помощью командлета Get-ADGroup:
Get-ADGroup -Filter {Name -like "msk-helpdesk*"} | Select SID
Чтобы назначить SDDL строку с правами на определённую службу, используется команда sc sdset. К примеру, права пользователю на службу spooler могут быть предоставлены следующей командой:
sc sdset Spooler "D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)(A;;RPWPCR;;;S-1-5-21-2133228432-2794320136-1823075350-1000)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)"
Предоставление прав на перезапуск службы с помощью SubInACL
Для управления правами служб Windows гораздо проще воспользоваться консольной утилитой SubInACL из комплекта Sysinternals от Марка Руссиновича (права на которую вместе с автором теперь принадлежат Microsoft). Синтаксис этой утилиты гораздо проще и удобнее для восприятия. Рассмотрим, как предоставить права перезапуск службы с помощью SubInACL:
- Скачайте subibacl,msi со страницы (https://www.microsoft.com/en-us/download/details.aspx?id=23510) и установите ее на целевой системе;
- В командной строке с правами администратора перейдите в каталог с утилитой:
cd “C:\Program Files (x86)\Windows Resource Kits\Tools\
” - Выполните команду:
subinacl.exe /service Spooler /grant=contoso\tuser=PTO
Примечание. В данном случае мы дали пользователю права на приостановку (Pause/Continue), запуск (Start) и остановку (Stop) службы. Полный список доступных разрешений:F : Full Control
R : Generic Read
W : Generic Write
X : Generic eXecute
L : Read controL
Q : Query Service Configuration
S : Query Service Status
E : Enumerate Dependent Services
C : Service Change Configuration
T : Start Service
O : Stop Service
P : Pause/Continue Service
I : Interrogate Service
U : Service User-Defined Control Commands
Если нужно предоставить права на службу, запущенную на удаленном компьютере, используйте следующий синтаксис команды subinacl:
subinacl /SERVICE \\msk-buh01\spooler /grant=contoso\tuser=F
- Осталось войти в данную систему под учетной записью пользователя и попробовать перезапустить службу командами:
net stop spooler
net start spooler
или
sc stop spooler && sc start spooler
Если вы все сделали верно, служба должна перезапуститься.
/revoke
, например:
subinacl.exe /service Spooler /revoke=contoso\tuser
Process Explorer: Установка разрешений на службу
Достаточно просто изменить разрешения на службу с помощью еще одной утилиты Sysinternals — Process Explorer. Запустите Process Explorer с правами администратора и найдите в списке процессов процесс нужной вам службы. В нашем примере это spoolsv.exe (диспетчер очереди печати — C:\Windows\System32\spoolsv.exe). Откройте свойства процесса и перейдите на вкладку Services.
Нажмите на кнопку Permissions и в открывшемся окне добавьте пользователя или группу, которой нужно предоставить права на сервис и выберите уровень полномочий (Full Control/Write/Read).
Назначаем разрешения на службу с помощью PowerShell
В галерее TechNet имеется отдельный неофициальный модуль PowerShell для управления разрешениями на разные объекты Windows — PowerShellAccessControl Module (скачать его можно здесь). Этот модуль позволяет управлять правами на службы. Импортируйте модуль в свою PS сессию:
Import-Module PowerShellAccessControl
Получить эффективные разрешения на конкретную службу из PowerShell можно так:
Get-Service spooler | Get-EffectiveAccess -Principal corp\tuser
Чтобы предоставить обычному пользователю права на запуск и остановку службы, выполните:
Get-Service spooler | Add-AccessControlEntry -ServiceAccessRights Start,Stop -Principal corp\tuser
Используем шаблоны безопасности (Security Templates) для управления разрешениями служб
Более наглядный (но и требующий большего количества действий) графический способ управления правами на службы – с помощью шаблонов безопасности. Для реализации, откройте консоль mmc.exe и добавьте оснастку Security Templates.
Создадим новый шаблон (New Template).
Задайте имя нового шаблона и перейдите в раздел System Services. В списке служб выберите свою службу Print Spooler и откройте ее свойства.
Установите тип запуска (Automatic) и нажмите кнопку Edit Security.
С помощью кнопки Add добавьте учетную запись пользователя или группы, которым нужно предоставить права. В нашем случае, нам достаточно права Start, Stop and pause.
Если открыть этот файл, можно увидеть, что данные о правах доступа сохраняются в уже упомянутом ранее SDDL формате. Полученная таким образом строка может быть использована в качестве аргументы команды sc.exe.
[Unicode] Unicode=yes [Version] signature="$CHICAGO$" Revision=1 [Service General Setting] "Spooler",2,"D:AR(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;RPWPDTRC;;;S-1-5-21-3243688314-1354026805-3292651841-1127)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)"
Осталось с помощью оснастки Security Configuration and Analysis создать новую базу данных (Open Database) и импортировать новый шаблон безопасности из файла Spooler User Rights.inf.
Примените шаблон, вызвав из контекстного меню команду Configure Computer Now.
Теперь можно под пользователем проверить, что у него появились права на управление службой Print Spooler.
Управление правами служб через групповые политики
Если нужно раздать пользователям права запуска/остановки сервиса сразу на множестве северов или компьютерах домена, проще всего воспользоваться возможностями групповых политик (GPO).
- Создайте новую или отредактируйте существующую GPO, назначьте ее на нужный контейнер с компьютерами в Active Directory. Перейдите в раздел политик Computer configuration -> Windows Settings -> Security Settings -> System Services;
- Найдите службу Spooler и аналогично методике с шаблонами безопасности, рассмотренной ранее, предоставьте права пользователю. Сохраните изменения;Примечание. Ранее мы показывали, как с помощью аналогичной GPO можно скрыть от всех пользователей системы любую службу Windows.
- Осталось дождаться обновления политик на клиентских компьютерах и проверить применение новых разрешений на службу.
Настройки безопасности для все служб, для которых вы изменили разрешения по-умолчанию хранятся в собственной ветке реестра HKLM\System\CurrentControlSet\Services\<servicename>\Security в параметре Security типа REG_BINARY.
Это означает, что одним из способов установки аналогичных разрешений на других компьютерах может быть экспорт/импорт данного параметра реестра (в том числе через GPO).
Итак, мы разобрали несколько способов управления правами на службы Windows, позволяющих предоставить произвольному пользователю любые права на системные службы. Если пользователю требуется удаленный доступ к службе, без предоставления ему прав локального входа в систему, нужно разрешить пользователю удаленно опрашивать Service Control Manager.
Есть более простой вариант с GUI c поддержкой Windows 8/7/Vista/XP and Windows Server 2012/2008 R2/2008/2003
https://www.coretechnologies.com/products/ServiceSecurityEditor/
Для удаленного управления службами, нужны права LO — SERVICE_INTERROGATE
Спасибо за инфу!
Если выполнил команду subinacl.exe /service Spooler /grant=contoso\tuser=PTO
То как теперь забрать права у contoso\tuser или вернуть права по умолчанию?
Убрать из ACL права доступа для учетки можно аналогично. Только вместо grant используется revoke:
subinacl.exe /service Spooler /revoke=contoso\tuser
Дал пользователю полные права на службу. С другого компа ws1 от этого пользователя пытаюсь запустить службу:
sc \\ws2 start spooler
[SC] StartService: OpenService: ошибка: 5:
Отказано в доступе.
Локально на компе ws2 служба управляется. Как добиться управлять ею удаленно?
Посмотрите статью про предоставление права на удаленное подключение к диспетчеру службу Service Control Manager (SCManager). Там все описано:
https://winitpro.ru/index.php/2016/06/15/predostavlenie-prav-na-udalennoe-podklyuchenie-k-service-control-manager/
Здраствуйте! Есть интересное поведение службы APCPBAgent.
Установлена на DC (2016) который физическая машина к которой USB присоеденён sua1500rmi2u
По дефолту, всё работает без замечаний.
Но нужно, чтобы .cmd по событию делал shutdown /m серверам по сети.
Так как по дефолту служба стратует с учёткой SYSTEM, то разумеется .cmd не может гасить.
Создан в домене USER которому GPO назначены права Принудительное удаленное завершение работы и, на всякий случай, Завершение работы системы. Хотя логон Local и RDP запрещён.
Проблема в том, что:
Установка прав для пользователя через ProcessExplorer проходит — но не стартует служба под этой учёткой.
Если этого пользователя включить в Domain группу Администраторы — стартует без проблем.
Может это всё так как у нас в этом случае DC и потому всё так.
Ещё интересно, что права ProcessExplorer даю — а их в нём не видно. Перезагружаю — нет в ACL пользователя S-1-5-21-8-***-***-1613 . НО cs показывает
В C:\Windows\system32>sc sdshow APCPBEAgent
D:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-21-8-***-***-1613)(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;SO)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)
Итак — сейчас работает так как дал права Администраторы.
За статью спасибо.
Не много не понял, что вы хотите. Речь о старте службы на DC из-под пользовательской учетки или про предоставление права на службу для не-админа?
Если первое, — через локальную политику контроллера домена (или через default domain controller policy) можно добавить нужному пользователю права «Log on as a service» (Computer Configuration -> Windows Settings -> Security Settings -> Local Policies -> User Rights Assignment). В этом случае не придется делать его админом домена
Задачи две. Одна — Domain User разрешить запускать службу APCPBEAgent — 10 раз проверял, перезагружал, назначал права. В Def. DC Pol назначено право Log on as a service — не работает. Добавляешь учётку в Домайн Админс — работает. Эвент Вьювер говорит абсолютно неинформативно Событие 101 Error: 5, Time out 90 seconds. Service start operation canceled.
Не удается назначить права на службу MpsSvc (Брандмауэр windows) через групповые политики: создал политику с типом запуска и добавил все разрешения доменной группе на службу. Политика применяется, но позволяет управлять только типом запуска службы, а действия остановить, запустить не активны. Помогите, пожалуйста, разобраться как разрешить определенной группе пользователей управлять службой Брандмауэр Windows.
Привет, вопрос совсем по теме, но все поможете.
А как запустить службу только у определенного пользователя. Т.е. например если авторизовался user, то в его сессии служба запустилась. Если авторизовался admin — не запустилас.
Только логон скрипт — bat или powershell — что вам удобнее