Dnes jeden příspěvek do kategorie IT. Potřebovali jsme nastavit, aby daný uživatel (ne administrátor) mohl provádět restart Windows služby. Zde je postup jak toto nastavit.
Pro změnu nastavení práv použijeme utilitu sc a její příkaz sdset. Předtím než něco budeme měnit, tak si nejprve vyjedeme jaké má služba aktuální nastavení, použijeme příkaz sdshow:
sc sdshow ServiceName
A výsledek může vypadat nějak takto:
D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)
Asi nemá úplně cenu rozebírat co zde všechny “znaky” znamenají, ve zkratce asi takto – jedná se o popis práv - Security Descriptor (SD) vypsaný ve tzv. SDDL formátu (Security Descriptor Definition Language, více o něm také zde). Jednotlivá práva jsou zde uváděna za sebou pomoci ACL (Access Control List) vždy uzavřeno v závorce. Jsou zde uváděna pro dvě části DACL (Discretionary Access Control List) – část za D: a SACL (System Access Control List) – část za S:.
Ale zpět k našemu problému, potřebujeme konkrétnímu uživateli přidat práva na Start a Stop služby, taková práva zadáme takto:
(A;;RPWP;;;S-1-5-21-1892130988-506710545-2335334968-1051)
Jedná se o zápis ACL, ten obsahuje 6 částí:
(type;flags;rights;object guid;inherit object guid;account sid)
V našem případě máme zadáno ACL typ A – Access Allowed, druhá část Flags je neuvedená, ve třetí částí jsou uvedena požadovaná práva, tedy RP - Allows service start a WP - Allows service stop. Další dvě části jsou vynechány a v poslední části je nutné uvést SID (Security Identifier) uživatele, kterému práva potřebujeme nastavit. O ACL více zde.
Jak získat SID uživatele? K tomu můžeme použít Sysinternals utilitu PsGetSid. Spustíme jí s parametrem jména účtu uživatele, pro kterého potřebujeme vypsat SID.
Celý ACL přidáme k právům, které nám vrátil příkaz sdshow do D:. Výsledek použijeme do příkazu sdset, celý příkaz bude následující:
sc sdset ServiceName D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)(A;;RPWP;;;S-1-5-21-1892130988-506710545-2335334968-1051)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)
Více o nastavení práv je možné se dále dočíst například zde.
Tím máme hotovo, služba lze nyní pod daným uživatelem např. v Services konzoli Spustit, zastavit a restartovat.
Co dělat v případě, že si při hraní s nastavením práv služby tak zvaně pod sebou uřízneme větev a zrušíme si práva i na nastavování práv?
V takovém případě je potřeba spustit příkaz s nastavením výchozích práv tj.:
sc sdset ServiceName D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)
Příkaz je ale potřeba spustit pod účtem Local System, podle tohoto článku na KB se dovíme, že se to provede spuštěním příkazu at 10:34 /interactive cmd (s časem nadcházející minuty). Toto řešení je ale pouze pro Windows Server 2003 a na systémech Windows Vista a vyšších již není možné (interaktivní mód je z bezpečnostních důvodů potlačen). Nechápu, proč na oficiální Knowledge Base nevznikají nové verze článků pro řešení stejných problémů v novějších systémech. Řešením je tento postup:
- Stáhnout Sysinternals utilitu PsExec.
- Spustit příkazem
psexec /s cmd
V zobrazeném command prompt již můžeme provést výše uvedený příkaz na nastavení výchozích práv služby.
A pro vývojáře zde mám třídu pro vytvoření Security Descriptoru - SecurityDescriptor.cs.