Розглянемо особливості надання прав віддаленого доступу до списку служб, запущених на сервері, доменним користувачем, у яких відсутні права локальних адміністраторів. По суті завдання зводиться до надання доступу на віддалене підключення до інтерфейсу диспетчера управління службами - Service Control Manager (SCManager).
Як виглядає проблема. Припустимо, ми хочемо, щоб віддалений користувач / або система моніторингу могли опитувати стан служб на якомусь сервері. Зі зрозумілих причин цей віддалений користувач не має прав адміністративних права і права на локальний вхід на сервер.
При спробі підключитися і отримати список служб на віддаленому комп'ютері за допомогою консолі services.msc, користувач отримує помилку:
Windows was unable to open service control manager database on computer_name
Error 5: Access is denied.
Якщо ж спробувати вивести список служб на віддаленому сервері за допомогою утиліти sc.exe, помилка така:
C: \ Windows \ system32> sc \\ obts-01 query
Access is denied.
Можливість отримати доступ до списку служб контролюється дескриптором безпеки бази даних Service Control Manager, віддалений доступ до якої для користувачів "Authenticated Users" був обмежений ще в Windows 2003 SP1 (що, загалом-то, логічно). Права на віддалений доступ до даної службі є тільки у членів групи локальних адміністраторів.
Розглянемо, як надати віддалений доступ до диспетчера Service Control Manager для отримання списку служб сервера і можливість отримання їх статусів звичайним користувачам (без прав адміністратора) на прикладі Windows Server 2012 R2.
Поточні дозволу менеджера сервісів (SCM) можна отримати за допомогою утиліти sc.exe, виконавши в командному рядку, запущеної з правами адміністратора:
sc sdshow scmanager
Команда поверне приблизно таку SDDL рядок:
D: (A ;; CC ;;; AU) (A ;; CCLCRPRC ;;; IU) (A ;; CCLCRPRC ;;; SU) (A ;; CCLCRPWPRC ;;; SY) (A ;; KA ;;; BA) (A ;; CC ;;; AC) S: (AU; FA; KA ;;; WD) (AU; OIIOFA; GA ;;; WD)
В даному випадку видно, що за замовчуванням групі Authenticated Users (AU) дозволено тільки підключатися в SCM, але не опитувати (LC) служби. Скопіюйте рядок у вікно будь-якого тестового редактора.
Наступний етап - отримання SID користувача або групи, якій ми хочемо надати віддалений доступ до SCM (Як отримати SID користувача по імені). Наприклад, отримаємо SID AD групи msk-hd так:
Get-ADgroup -Identity 'msk-hd' | select SID
SID
---
S-1-5-21-2470146451-3958456388-2988885117-23703978
В текстовому редакторі в SDDL рядку потрібно скопіювати блок (A ;;CCLCRPRC ;;;IU) - (IU - означає Interactive Users)), замінити в скопійованому блоці IU на SID користувача / групи і вставити отриманий рядок перед S:.
У нашому випадку вийшла така рядок:
D: (A ;; CC ;;; AU) (A ;; CCLCRPRC ;;; IU) (A ;; CCLCRPRC ;;; SU) (A ;; CCLCRPWPRC ;;; SY) (A ;; KA ;;; BA) (A ;; CC ;;; AC) (A ;; CCLCRPRC ;;;S-1-5-21-2470146451-3958456388-2988885117-23703978)S: (AU; FA; KA ;;; WD) (AU; OIIOFA; GA ;;; WD)
А тепер за допомогою sc.exe змінимо параметри дескриптора безпеки Service Control Manager:
sc sdset scmanager "D: (A ;; CC ;;; AU) (A ;; CCLCRPRC ;;; IU) (A ;; CCLCRPRC ;;; SU) (A ;; CCLCRPWPRC ;;; SY) (A ;; KA ;;; BA) (A ;; CC ;;; AC) (A ;; CCLCRPRC ;;; S-1-5-21-2470146451-3958456388-2988885117-23703978) S: (AU; FA; KA ;; ; WD) (AU; OIIOFA; GA ;;; WD) "
рядок [SC] SetServiceObjectSecurity SUCCESS говорить про те, що нові параметри безпеки успішно застосовані, і ми видали користувачеві прав, аналогічні права локально аутентіфіцированний користувачів: SC_MANAGER_CONNECT, SC_MANAGER_ENUMERATE_SERVICE, SC_MANAGER_QUERY_LOCK_STATUS і STANDARD_RIGHTS_READ.
Перевіримо, що тепер віддалений користувач може отримувати список служб і їх статус за допомогою консолі управління службами (services.msc) і за допомогою запиту sc \\ server-name1 query
Права на управління запущеними службами при цьому, природно, відсутні, тому що доступ до кожної службі контролюється індивідуальної ACL. Щоб надати користувачеві права на запуск / зупинку служб сервера потрібно скористатися інструкціями зі статті Надання прав користувачеві на управління (запуск, зупинку, перезапуск) службами Windows.
Порада. При призначенні прав на SCManager, відмінних від стандартних, вони зберігаються в гілці HKLM \ SYSTEM \ CurrentControlSet \ Control \ ServiceGroupOrder \ Security. І якщо при формуванні SDDL рядки була допущена помилка, скинути поточні дозволу на дефолтні можна простим видаленням цієї гілки і перезавантаженням.