Буквально сегодня понадобилось дать человеку возможность перезапускать тестовый вебсервер под виндой. Права админа давать естественно давать не хочется. «Мощный» юзер не подходит.
Как видно, есть 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, напишите имя группы.