Peu de documentation en Français, mais cependant, pas mal d’explications sur MSDN, notamment concernant la classe "ActiveDirectoryAccessRule" permettant la délégation d’Active Directory/gestion des permissions en .NET (et donc en PowerShell).
DACL/SACL & ACE ?
Avant de rentrer dans le vif du sujet, il est important de bien comprendre les listes d’accès Active Directory. Une liste de contrôle d’accès (ACL) est une liste d’entrées de contrôle d’accès (ACE). Chaque ACE dans une ACL identifie un "trustee" (Un compte utilisateur, un groupe, ou une session sur lequel un accès de controle (ACE) s’applique) et précise les droits d’accès autorisés, refusés ou vérifiés pour l’administrateur. Le descripteur de sécurité (security descriptor) pour un objet sécurisé peut contenir deux types d’ACL: une DACL et une SACL.
Une DACL (Discretionary access control list) identifie les "trustees" qui sont autorisés ou non à accéder à un objet. Quand un processus essaie d’accéder à un objet, le système vérifie l’ACE dans la DACL de l’objet pour déterminer s’il faut accorder l’accès. Si l’objet n’a pas de DACL, le système autorise l’accès complet à tout le monde. Si la DACL de l’objet n’a pas de ACE, le système refuse toutes les tentatives pour accéder à l’objet parce que la DACL ne permet pas de droits d’accès. Le système vérifie l’ACE dans l’ordre jusqu’à ce qu’il trouve une ou plusieurs entrées de contrôle qui permettent à tous les droits d’accès requis, ou jusqu’à ce que l’un des droits d’accès demandé soit refusé.
Une SACL (System access control list) permet aux administrateurs de logger les tentatives d’accéder à un objet. Chaque ACE précise les types de tentatives d’accès par un "trustee" qui a causé la génération d’un enregistrement dans le journal des évènements de sécurité. Une ACE dans une liste SACL peut générer des enregistrements d’audit lors d’une tentative d’accès échoue, quand elle réussit, ou les deux.
Rentrons maintenant dans le sujet, jouons avec les droits standard, les droits étendus, ou les droits spécifiques. Pour l’affection de droits, la classe System.DirectoryServices.ActiveDirectoryAccessRule sera utilisé. Commençons par découvrir les constructeurs. Si vous êtes allergique à MSDN, utilisons la commande suivante:
[System.DirectoryServices.ActiveDirectoryAccessRule].GetConstructors()
Les droits standards
Commençons par les droits standards, en récupérant le SID de l’utilisateur qui recevra la délégation:
$Login = "Utilisateur-Test" $NTAccount = New-Object system.security.principal.ntaccount($Login) $SID = $NTAccount.translate([system.security.principal.securityidentifier])
Ajoutons maintenant les droits AD en utilisant le constructeur:
.ctor( System.Security.Principal.IdentityReference System.DirectoryServices.ActiveDirectoryRights System.Security.AccessControl.AccessControlType )
Spécifions les droits a ajouter et spécifions le type d’accès
$rights = "GenericAll" $AccessType = "Allow"
Ajoutons les droits et sauvegardons l’objet
$root = [adsi]"LDAP://RootDSE" $OU = [adsi]"LDAP://ou=OU-Test,"+$root.distinguishedName $ace = New-Object System.DirectoryServices.ActiveDirectoryAccessRule($SID, $rights, $AccessType) $OU.psbase.get_objectsecurity().AddAccessRule($ace) $OU.psbase.CommitChanges()
Les droits étendus
Passons maintenant aux droits étendus ainsi qu’aux droits spécifiques, nous allons utiliser le constructeur suivant:
.ctor( System.Security.Principal.IdentityReference System.DirectoryServices.ActiveDirectoryRights System.Security.AccessControl.AccessControlType System.Guid System.DirectoryServices.ActiveDirectorySecurityInheritance )
Pour les droits étendus, il est nécessaire de récupérer le GUID du droit (stocké dans la partition de configuration) stocké dans l’attribut "rightsGUID". Pour ce faire, je vous propose la fonction suivante:
function Get-RightsGUID
{
Param ($ExtendedRight, $dse)
$ER = [adsi]("LDAP://cn=Extended-Rights,"+$dse.configurationNamingContext)
$OU = [adsi]("LDAP://cn="+$ExtendedRight+","+$ER.distinguishedName)
[system.guid]$guid = $OU.rightsGUID
return $guid.ToString()
}
Pour l’utiliser :
$guid = Get-RightsGUID "Change-PDC" $root
Même principe que précédemment pour les droits standards:
$Login = "Utilisateur-Test" $NTAccount = New-Object system.security.principal.ntaccount($Login) $Rights = "ExtendedRight" $AccessType = "Allow" $Inherit = [System.DirectoryServices.ActiveDirectorySecurityInheritance]"All" $ace = New-Object System.DirectoryServices.ActiveDirectoryAccessRule($NTAccount, $Rights, $AccessType, $guid, $Inherit) $OU.psbase.get_objectSecurity().AddAccessRule($ace) $OU.psbase.CommitChanges()
Les droits spécifiques
Pour les droits spécifiques, il est nécessaire de récupérer le GUID du droit (stocké dans la partition "schéma") stocké dans l’attribut "schemaIDGUID". Pour ce faire, je vous propose la fonction suivante:
function get-schemaGUID
{
Param ($OU, $dse)
$obj = [adsi]"LDAP://cn="+$OU+","+$dse.schemaNamingContext
[system.guid]$guid = $obj.schemaIDGUID[0]
return $guid.ToString()
}
Pour l’utiliser:
$guid = get-schemaGUID "computer" $root
Même principe que précédemment:
$Login = "Utilisateur-Test" $NTAccount = New-Object system.security.principal.ntaccount($Login) $Rights = “ReadProperty, WriteProperty” $AccessType = "Allow" $Inherit = [System.DirectoryServices.ActiveDirectorySecurityInheritance]"All" $ace = New-Object System.DirectoryServices.ActiveDirectoryAccessRule($NTAccount, $Rights, $AccessType, $guid, $Inherit) $OU.psbase.get_objectSecurity().AddAccessRule($ace) $OU.psbase.CommitChanges()
Voila qui conclu cette introductions aux ACL Active Directory. Vous trouverez plus d’informations sur la gestion de l’Active Directory en .NET sur MSDN



