DACL des Services Windows - Service Control Manager Security - Permissions WMI
Un admin possède de nombreuse façon d’agir sur les services Windows
(MMC, NetStop/NetStart, WMI, …)
Mais si vous voulez donner à un user/group le droit d’agir sur un seul service ?
Et remotly ?
Sans lui donner les droits admin sur la machine ?
Contrairement aux fichiers relativement simples à gérer niveau sécurité (clic droit/propriétés/sécurité NTFS), la gestion de la sécurité sur les services est assez confusing.
La Commande SC.EXE
- La gestion des DACL sur les services se fait par la commande SC.EXE
- Pour afficher les DACL, il faut utiliser l’argument SDSHOW.
SC.EXE SDSHOW <ServiceName>
- Affichons les DACL du service « Service Management » :
SC.EXE SDSHOW SCMANAGER
Ou du service DHCP :
> Les résultats sont générés en langage SDDL (Security Descriptor Definition Language).
Comment lire les résultats
- Notons la séparation en deux parties, D: et S:
D:(A;;CC;;;AU)(A;;CCLCRPRC;;;IU)(A;;CCLCRPRC;;;SU)(A;;CCLCRPWPRC;;;SY)(A;;KA;;;BA)S:(AU;FA;KA;;;WD)(AU;OIIOFA;GA;;;WD)
-> La partie en orange D: est celle qui nous intéresse, elle s’intéresse aux permissions (DACL), la partie en verte S: s’intéresse à l’audit (SACL)
- Prenons donc notre première partie :
D:(A;;CC;;;AU)(A;;CCLCRPRC;;;IU)(A;;CCLCRPRC;;;SU)(A;;CCLCRPWPRC;;;SY)(A;;KA;;;BA)
-> Chaque autorisation est définie entre parenthèse, nous avons donc 5 permissions différentes ici.
- Prenons en exemple une permission :
(A;;CCLCRPRC;;;IU) qui se découpe elle-même en 3 parties : A ;; CCLCRPRC ;;;; IU
• La première partie désigne le type de permission
A = ACCEPT
D = DENY
• La deuxième partie désigne la chaîne des autorisations (par paire)
CC = Queryconf
LC = QueryStat
RP = Start
RC = RCtl
• La dernière partie désigne le type d’utilisateur
IU = Interactive Logon User
> Pour lire les résultats, les tableaux suivants permettent d’interpréter chaque autorisation :
Paire |
Droit ou autorisation |
CC |
QueryConf |
DC |
ChangeConf |
LC |
QueryStat |
SW |
EnumDeps |
RP |
Start |
WP |
Stop |
DT |
Pause |
LO |
Interrogate |
CR |
UserDefined |
GA |
GenericAll |
GX |
GenericExecute |
GW |
GenericWrite |
GR |
GenericRead |
SD |
Del |
RC |
RCtl |
WD |
WDac |
WO |
WOwn |
Code |
Type d'utilisateur |
DA |
Domain Administrators (Administrateurs du domaine) |
DG |
Domain Guests (Invités du domaine) |
DU |
Domain Users (Utilisateurs du domaine) |
ED |
Enterprise Domain Controllers (Controleurs de domaines d'entreprise) |
DD |
Domain Controllers (Contrôleurs du domaine) |
DC |
Domain Computers (Ordinateurs du domaine) |
BA |
Built-in (Local ) Administrators (Administrateurs intégrés (local)) |
BG |
Built-in (Local ) Guests (Invités intégrés (local)) |
BU |
Built-in (Local ) Users (Utilisateurs intégrés (local)) |
LA |
Local Administrator Account (Compte Administrateur local) |
LG |
Local Guest Account (Compte Invité local) |
AO |
Account Operators (Opérateurs de compte) |
BO |
Backup Operators (Opérateurs de sauvegarde) |
PO |
Printer Operators (Opérateurs d'impression) |
SO |
Server Operators (Opérateurs de serveur) |
AU |
Authenticated Users (Utilisateurs authentifiés) |
PS |
Personal Self (Personnel) |
CO |
Creator Owner (Créateur propriétaire) |
CG |
Creator Group (Groupe créateur) |
SY |
Local System (Système local) |
PU |
Power Users (Utilisateurs avec pouvoir) |
WD |
Everyone (World) (Tout le monde (global)) |
RE |
Replicator (Duplicateurs) |
IU |
Intercative Logon User (Session utilisateur interactive) |
NU |
Network Logon User (Utilisateur d'ouverture de session réseau) |
SU |
Service Logon User (Service de connexion utilisateur) |
RC |
Restricted Code (Code restreint) |
WR |
Write Restricted Code (Code restreint en écriture) |
AN |
Anonymous Logon (Ouverture de session anonyme) |
SA |
Schema Administrators (Administrateurs de schéma) |
CA |
Certificate Services Administrators (Administrateurs des services de certificats) |
RS |
Remote Access Servers Group (Groupe serveurs d'accès distant) |
EA |
Enterprise Administrators (Administrateurs de l'entreprise) |
PA |
Group Policy Administrators (Administrateurs de stratégies de groupe) |
RU |
Alias to Allow Previous Windows 2000 (Alias autorisant pré-Windows 2000) |
LS |
Local Service Account (for Services) (Compte Service local (pour les services)) |
NS |
Network Service Account (for Services) (Compte Service réseau (pour les services)) |
RD |
Remote Desktop Users (for Terminal Services) (Utilisateurs du Bureau à distance (pour les services Terminal Server)) |
NO |
Network Configuration Operators (Opérateurs de configuration réseau) |
MU |
Performance Monitor Users (Utilisateurs de l'Analyseur de performances) |
LU |
Performance Log Users (Utilisateurs du journal de performance) |
IS |
Anonymous Internet Users (Utilisateurs Internet anonymes) |
CY |
Crypto Operators (Opérateurs de cryptographie) |
OW |
Owner Rights SID (SID des droits du propriétaire) |
RM |
RMS Service (Service RMS) |
Modifier une permission
Vous pouvez modifier cette sécurité à partir du code utilisateur du tableau précédent pour les types d’utilisateurs générique, ou utiliser un SID Active Directory appartement à un utilisateur ou groupe.
> Attention il faut obligatoirement utiliser le SID sous la forme S-1-1-21-51XXXXXXXX-XXXX-XXX
- Il vous faut utiliser la commande SC SDSET pour modifier une permission
Prenons toujours l’exemple du service « Service Management » : il est nécessaire d’avoir les droits en Start/Lecture sur ce service pour faire un Get-Service en Powershell à distance.
Donc, par défaut impossible de faire des requêtes à distance sur ce service pour les utilisateurs standards (authentifiés):
Modifions maintenant les permissions du service « Service Management » pour offrir ce droit à ces utilisateurs authentifiés :
sc sdset scmanager D:(A;;CCLCRPRC;;;AU)(A;;CCLCRPRC;;;IU)(A;;CCLCRPRC;;;SU)(A;;CCLCRPWPRC;;;SY)(A;;KA;;;BA)
> Les utilisateurs authentifiés peuvent maintenant lister les services sur la machines :
Maintenant prenons l’exemple avec un groupe AD :
Même procédure, mais avec le SID :
Et ensuite, c’est accessible.
Permissions WMI
En complément, certaines requêtes nécessitent de passer par du WMI.
Imaginons que l’on veuille aussi offrir l’accès WMI en lecture, à distance pour ces utilisateurs.
- Il vous faut dans la MMC WMI activer l’option Remote Enable / Enable Account
> Il n’est malheureusement pas possible de définir ces droits par GPO, mais on peut le contourner via powershell.
Ou par un VBScript :
• Ajouter votre droit dans la MMC (comme dans la capture ci-dessus)
• Extraire les infos WMI du namespace pour ensuite faire un différentiel
wmic /namespace:\\root\CIMV2 /output:c:\extractwmi.txt path __systemsecurity call getSD
(ou un autre namespace)
• Dans le fichier généré extractwmi.txt, repéré la ligne de chiffre entre {}
Créer un nouveau vbscript.vbs avec ce contenu pour déployer cette config :
strSD = array(*****Placer ici la ligne de chiffre sans espace*******)
set namespace = createobject("wbemscripting.swbemlocator").connectserver(,"root\CIMV2")
set security = namespace.get("__systemsecurity=@")
nStatus = security.setsd(strSD)
Exemple :
strSD = array(1,0,4,129,184,0,0,0,200,0,0,0,0,0,0,0,20,0,0,0,2,0,164,0,6,0,0,0,0,2,36,0,33,0,0,0,1,5,0,0,0,0,0,5,21,0,0,0,23,36,194,102,255,27,59,41,139,45,224,36,20,35,0,0,0,2,36,0,33,0,0,0,1,5,0,0,0,0,0,5,21,0,0,0,23,36,194,102,255,27,59,41,139,45,224,36,238,23,0,0,0,18,20,0,19,0,0,0,1,1,0,0,0,0,0,5,11,0,0,0,0,18,20,0,19,0,0,0,1,1,0,0,0,0,0,5,19,0,0,0,0,18,20,0,19,0,0,0,1,1,0,0,0,0,0,5,20,0,0,0,0,18,24,0,63,0,6,0,1,2,0,0,0,0,0,5,32,0,0,0,32,2,0,0,1,2,0,0,0,0,0,5,32,0,0,0,32,2,0,0,1,2,0,0,0,0,0,5,32,0,0,0,32,2,0,0)
set namespace = createobject("wbemscripting.swbemlocator").connectserver(,"Root\CIMV2")
set security = namespace.get("__systemsecurity=@")
nStatus = security.setsd(strSD)