войти зарегистрироваться

Windows whois

индекс
152,43

Раздаем права на запуск/остановку сервисов под Windows

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

букв много

и тут на помощь приходит technet, который расcказывает про sc.

В данном случае нас интересуют 2 команды:
sc sdshow — показывает права
sc sdset — устанавливает права

Для начала узнаем, какие права у нашего сервиса уже есть:
C:\Users\administrator>sc sdshow service_name

D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCR
RC;;;IU)(A;;CCLCSWLOCRRC;;;SU)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)


Без изысков.

Как видно, есть 2 интересных префикса:
S: — System Access Control List (SACL) — это нас сейчас не интересует.
D: — Discretionary ACL (DACL) — здесь указываются права для всех и всего.

Смотрим далее.
Первая буква после скобок означает разрешаем (A, Allow) или запрещаем (D, Deny).

Мы разрешаем:
(A;;;;;)

И потом видим комбинации из двух букв:
CC - SERVICE_QUERY_CONFIG
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


По сути, нас будут интересовать последние три опции:
(A;;RPWPDT;;;)

Последние 2 буквы обозначают кому мы разрешаем или запрещаем:
AU Authenticated Users
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
NO Network configuration operators
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 пользователя?
есть не один способ :)

но, самый простой и удобный (на мой взгляд), написать маленький скриптик на vb:
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")

Set objAccount = objWMIService.Get _
("Win32_UserAccount.Name='username',Domain='domain'")
Wscript.Echo objAccount.SID


Заменяем имя пользователя и домен по своему вкусу, сохраняем файл с расширением .vbs и запускаем.
Появляется алерт с SID.

Копируем в блокнот(или в любое другое место)
Можно скрипт запустить в консоли, сэкономим время :)

И так. Узнали SID.
Вставляем в ключ:
(A;;RPWPDT;;;S-1-5-21-3992622163-2725220152-438995547-4172)

Теперь подготавливаем команду целиком:
sc sdset D:(A;;RPWPDT;;;S-1-5-21-3992622163-2725220152-438995547-4172)(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCR
RC;;;IU)(A;;CCLCSWLOCRRC;;;SU)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)


Наш ключ вставляем в любое место, но важно чтобы он был перед префиксом S.
Важно не ошибиться, иначе можем потерять доступ к сервису :)
Запускаем.

проверяем:
sc \\server stop «service_name»

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

UPD можно, кстате, использовать группы.
для того чтобы узнать SID группы — вместо username, напишите имя группы.

комментарии (36)

  • Круто. Плюсую.
  • По-Челябински =)
    • Сурово то есть? :)
    • я бы сказал, UNIX-style :)
      и это прекрасно!
      • да, особенно вот это:

        sc sdset D:(A;;RPWPDT;;;S-1-5-21-3992622163-2725220152-438995547-4172)(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCR
        RC;;;IU)(A;;CCLCSWLOCRRC;;;SU)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)


        просто и лаконично, прям как в bash
      • угу, прямо как
         sudo restart-web-server-script
        
  • Спасибо, только сегодня возникла такая задача!
  • Закинул в избранное, спс.
  • Большое спасибо, завтра отличный день для того чтобы в этом разобраться поподробнее.
  • И кто там говорил, что linux сложнее? :)
    Сейчас вызову гнев толпы, но всё же скажу, что в linux это делается одной интуитивно понятной строчкой в /etc/sudoers. Что-то вроде
    wiselord ALL=/etc/init.d/apache2 restart
    • некоторые задачи в линукс делать легче/проще )
      но, я был удивлен, что именно эта задачка оказалась настолько простой :)

  • Э… Мне одному кажется что все выше написанные комментарии (кроме пары) чертовски похожи на «камменты» ботов-спаммеров WordPress? o_O
    • а вы думали откуда спаммеры берут такие камменты?)
  • Капец… Это ж как brainfuck!
  • Как же мне в винде не хватает «sudo» =/
    • а как же runas /user:domain\admin «cmd»?
      • тогда уж так:
        echo runas /user:domain\admin %1 > %WINDIR%\sudo.bat

        и можно будет юзать sudo <команда> :)
      • Меняется окружение. Если я поставлю программу от админа, то все ярлыки будут созданы для него и т.п.
  • Спасибо, это очень-очень полезная информация. Я даже и не знал, что есть такие возможности!
  • Хм. а в вендосервере2008 есть галочка такая, позволяющая указать владельца сервиса в гуях.
    Только вот толку от нее почему-то никакой. Это то же самое что и в вашем способе, или там какие-то другие механизмы?
  • Уважаемые сэры, но это же мозгоебстволомство!
    Неинтуитивно до крайности само по себе. Да ещё и процесс черезж… кхм… некомфортного извлечения SID. Windows же славится своим «простым и понятным конфигурированием», обучение которому стоит во много-много раз дешевле обучения суровых линукс-админов. Ну и где? Функционал-то, в общем, нужный не раз и не два в жизни.
  • Жуть какая, простите.
    оффтоп конечно, но виндовая консоль это нечто.

    Помнится на одной конфе, рассказызавли взахлеб о том какая класная стала консоль у win
    в качестве примера спичер рассказал как это намного проще чем в никс убить процессы которые кушают больше, чем X метров памяти.
    Лаконичная такая строчка, но спичер отказался запускать команду на своей презенташке, так как во время подготовки к докладу, это исследование убило половину сервисов и собственно сам доклад в ppt.
    Мне так понравилась сама постановка задачи — убить все процессы больше 10Mb.
    Win сказал — яволь майн фюрер (причем не выкинув никаких конфирмейшенов), и грохнул все, включая жизнено важное для работы системы.
  • PS:
    $user = "username"
    $rights = "RPWPDT"
    $service = "servicename"
    
    $sid = (new-object security.principal.NtAccount($user)).translate([security.principal.securityidentifier]).Value
    $current = (& $env:systemroot\system32\sc sdshow $service)[1]
    $current = $current.Replace("D:(", "D:(A;;$rights;;;$sid)(")
    & $env:systemroot\system32\sc sdset $service $current
  • настоящий хабрапользователь должен раздавать инвайты на запуск/остановку сервисов! :D
  • Если кто не в курсе, более удобный способ управления (создание, удаление, назначение прав _человеческим_ способом, изменение типа запуска и зависимостей) для служб
    www.rsdn.ru/article/baseserv/svcadmin-1.xml
    www.rsdn.ru/article/baseserv/svcadmin-2.xml

    прямая ссылка www.rsdn.ru/article/baseserv/svcadmin-1/svcadmin.zip там svcadmin,
    но почитать таки советую. Must have.
  • Спасибо, как раз недавно была бы полезна такая шпаргалка.
    Чтобы комментарий остался небесполезным напоминаю альтернативный способ получить SID:
    утилита входящая в состав pstools — psgetsid.exe от sysinternals
    весит немного, знаний vb(простите, не сложилось у нас) не требуется.
  • А чем плоха настройка через политики?

    • хм… я не нашел… хотя, видимо не особо старался…

      не подскажите где это? :)
      • Computer Configuration > Windows Settings > Security Settings > System Services
        Ещё где-то попадался скриншот с вкладкой Безопасность, прямо в управлении сервисами, но с какой он системы и как это включить — я не нашел.
        • повторюсь — svcsdmin :) Как раз с вкладкой безопасность, и все сделано по-уму.
  • А вот интересно, можно ли предоставить обычному пользователю домена право создавать шары, не вводя его при этом в группу локально-мощных пользователей?
  • sc sdset D:(A;;RPWPDT;;;S-1-5-21-3992622163-2725220152-438995547-4172)(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCR
    RC;;;IU)(A;;CCLCSWLOCRRC;;;SU)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)


    консоль из преисподней О_о
    • Те, кто не желает взрывать мозг такими строчками, используют subinacl.
      А люди, которые по религиозным или каким-либо другим причинам не любят vbscript и WMI, пользуются psgetsid.
  • Очень вовремя наткнулся на статью, я не то чтобы искал, но как собирался искать такое решение. А тут на тебе, и как сделать ручками, и ссылочка на svcadmin. Бывает же иногда везуха :)

    Большое спасибо автору и коментаторам :)
Только авторизованные пользователи могут оставлять комментарии. Авторизуйтесь, пожалуйста.