Удаленный рестарт сервиса 1С на Windows Server 2012 R2 (перезапуск агента 1С на кластере не под администратором)
Предоставление возможности определенным доменным пользователям производить перезапуск службы (агента 1С), не заходя на сам сервер и не имея административных прав (это освобождает администратора от необходимости заходить на сервер и делать перезапуск).
- Описание
- Подробнее
Описание
Дано: виртуальная машина с ОС Windows Server 2012 R2 (функция сервера — кластер 1С). Установлен сервер 1С 8.3. В службах присутствует агент сервера 1С.
Задача: в некоторых случаях возникает необходимость сделать перезапуск агента 1С, поэтому появилась задача сделать так, чтобы определенные доменные пользователи могли перезапускать службу (агента 1С), не заходя на сам сервер и не имея административных прав (это освобождает администратора от необходимости заходить на сервер и делать перезапуск).

Решение: для перезапуска агента пользователь на своем ПК будет запускать bat-файл, который содержит специальную команду удаленного перезапуска сервиса.
Описание
Настройку делаем в два этапа:
1. Подготовка сервера (кластера 1С) — назначение прав на сервис при помощи специальной утилиты.
2. Подготовка клиента (ПК пользователя) — создание bat-файла для удаленного перезапуска.
ЭТАП 1. Подготовка сервера (кластера 1С) — назначение прав на сервис при помощи специальной утилиты.
Первоначально нужно предоставить определенному пользователю право на перезапуск сервиса.
Самым удобным способом в моем случае оказалось это — задать права при помощи утилиты SubInACL (скачивайте ее с официального сайта Microsoft).
После установки утилиты SubInACL на кластере при помощи следующей команды можно посмотреть какие права назначены на сервис 1С агента:
subinacl.exe /service "1C:Enterprise 8.3 Server Agent (x86-64)" /display >c:\tmp\service1cAgent.txtВ файле service1cAgent.txt в итоге будет примерно такая информация:
=================================================
+Service 1C:Enterprise 8.3 Server Agent (x86-64)
=================================================
/control=0x0
/owner =system
/primary group =system
/audit ace count =1
/aace =everyone SYSTEM_AUDIT_ACE_TYPE-0x2
FAILED_ACCESS_ACE_FLAG-0x80 FAILED_ACCESS_ACE_FLAG-0x0x80
SERVICE_ALL_ACCESS
/perm. ace count =7
/pace =system ACCESS_ALLOWED_ACE_TYPE-0x0
SERVICE_QUERY_CONFIG-0x1 SERVICE_QUERY_STATUS-0x4 SERVICE_ENUMERATE_DEPEND-0x8
SERVICE_START-0x10 SERVICE_STOP-0x20 SERVICE_PAUSE_CONTINUE-0x40 SERVICE_INTERROGATE-0x80
READ_CONTROL-0x20000 SERVICE_USER_DEFINED_CONTROL-0x0100
/pace =builtin\administrators ACCESS_ALLOWED_ACE_TYPE-0x0
SERVICE_ALL_ACCESS
/pace =interactive ACCESS_ALLOWED_ACE_TYPE-0x0
SERVICE_QUERY_CONFIG-0x1 SERVICE_QUERY_STATUS-0x4 SERVICE_ENUMERATE_DEPEND-0x8
SERVICE_INTERROGATE-0x80 READ_CONTROL-0x20000 SERVICE_USER_DEFINED_CONTROL-0x0100
/pace =service ACCESS_ALLOWED_ACE_TYPE-0x0
SERVICE_QUERY_CONFIG-0x1 SERVICE_QUERY_STATUS-0x4 SERVICE_ENUMERATE_DEPEND-0x8
SERVICE_INTERROGATE-0x80 READ_CONTROL-0x20000 SERVICE_USER_DEFINED_CONTROL-0x0100
================================================= Видно, что кроме администраторов никто особых прав не имеет.
Требовалось назначить права на данный сервис нужному пользователю, например, mydomain\user1.
Сначала попробовала эту команду:
subinacl.exe /service "1C:Enterprise 8.3 Server Agent (x86-64)" /grant=mydomain\user1=PTOне сработало
При попытке что-то сделать с сервисом почти всегда был ответ об отсутствии доступа:

В результате экспериментов нашла нужную команду:
subinacl.exe /service "1C:Enterprise 8.3 Server Agent (x86-64)" /grant=mydomain\user1=LQSETOPIЭту команду необходимо запускать на каждого пользователя, которому нужно предоставить права на перезапуск сервиса.
Результат выполнения команды:

LQSETOPI — перечисление предоставляемых пользователю прав.
Расшифровка прав для данной команды:

При зачитывании информации о сервисе первой командой в текстовом файле получаем список назначенных прав:
/pace =mydomain\user1
ACCESS_ALLOWED_ACE_TYPE-0x0
SERVICE_QUERY_CONFIG-0x1
SERVICE_QUERY_STATUS-0x4
SERVICE_ENUMERATE_DEPEND-0x8
SERVICE_START-0x10
SERVICE_STOP-0x20
SERVICE_PAUSE_CONTINUE-0x40
SERVICE_INTERROGATE-0x80
READ_CONTROL-0x20000 ЭТАП 2. Подготовка клиента (ПК пользователя) — создание bat-файла для удаленного перезапуска.
У пользователя имеющего право на перезапуск сервиса используем утилиту PsService.exe (скачивайте ее с официального сайта Microsoft, установки она не требует).
Проверить доступ к сервису на удаленном сервере можно при помощи команды ниже.
Чтение сервиса под пользователем с другой машины:
psservice \\SRV-NODE -u mydomain\user1 query "1C:Enterprise 8.3 Server Agent (x86-64)"Где \\SRV-NODE — это имя сервера (кластера 1С), на котором нужно произвести перезапуск 1С агента.
Непосредственно перезапуск делается следующей командой.
Команда перезапуска сервиса под пользователем, у которого назначены вышеуказанные права:
psservice \\SRV-NODE restart "1C:Enterprise 8.3 Server Agent (x86-64)"На перезапуск сервиса может уйти около одной минуты.
При успешном выполнении команды получаем:

Для удобства делаем батник, запускающий данную команду (например, Restart1CAgentOnCluster.bat) и кладем его там же где и утилита psservice.
Содержимое файла Restart1CAgentOnCluster.bat:
@echo Restart 1C Agent On Cluster
psservice \\SRV-NODE restart "1C:Enterprise 8.3 Server Agent (x86-64)"
@pauseРезультат выполнения bat-файла на ПК пользователя:

В итоге для пользователя понадобится для файла:
- PsService.exe — утилита командной строки
- Restart1CAgentOnCluster.bat — должен лежать в той же папке, что и файл PsService.exe
Т.е. достаточно предоставить пользователю два этих файла и он сможет по запросу делать перезапуск 1С агента на сервере (например, если что-то у кого-то зависло в 1С, а админ в отпуске в Тайланде!)
В архиве к статье сам пример файла Restart1CAgentOnCluster.bat и содержимое этой статьи.
