Comment utiliser Visual Basic et ADsSecurity.dll pour commander correctement les ACE d'une liste de contrôle d'accès

Traductions disponibles Traductions disponibles
Numéro d'article: 269159 - Voir les produits auxquels s'applique cet article
Agrandir tout | Réduire tout

Sommaire

Résumé

Cet article indique comment utiliser ADsSecurity.dll pour obtenir un descripteur de sécurité (SD) sur un fichier, un objet Active Directory ou une clé de Registre. Cet article explique comment, une fois un SD obtenu, pour récupérer la liste de contrôle d'accès discrétionnaire (ACL) de ce SD, puis ajoutez une entrée de contrôle d'accès (ACE) dans l'emplacement approprié. L'article fournit un algorithme simple avec un exemple de code Microsoft Visual Basic illustrant comment commander une ACL correctement puis réécrire la liste de contrôle d'accès dans le SD.

Plus d'informations

La méthode IADsAccessControlList::AddAce ajoute l'ACE en haut de la liste de contrôle d'accès. Dans certains cas, ajoutant une ACE en haut créerez accès de sécurité non désirés. Le cache des propriétés ADSI (Active Directory Service Interfaces) sur Microsoft Windows Server 2003 et Microsoft Windows XP cela trie correctement la liste DACL avant de l'écrire à l'objet. Réorganisation des sont requis uniquement sur Microsoft Windows 2000. Le bon ordre des ACE d'une liste de contrôle d'accès est la suivante :
ACE access-denied qui s'appliquent à l'objet lui-même
ACE access-denied qui s'appliquent à un enfant de l'objet, tel qu'un jeu de propriétés ou propriété
ACE access-allowed, qui s'appliquent à l'objet lui-même
ACE access-allowed, qui s'appliquent à un enfant de l'objet, tel qu'un jeu de propriétés ou propriété
Dans les produits répertoriés dans cet article, l'interface IADsAccessControlList ne prend pas en charge une méthode qui organise correctement une liste de contrôle d'accès. Les entrées de contrôle d'accès doivent être triées dans ces cinq groupes :
Accès refusé sur l'objet
Accès refusé sur un enfant ou une propriété
Accès autorisé sur l'objet
Accès autorisé sur un enfant ou une propriété
Toutes les héritées ACE
L'ordre des ACE héritées ne doit pas être modifié. Toutes les ACE héritées sont ajoutés par le système d'exploitation et sont triés correctement. Un programmeur peut spécifier qu'une entrée de contrôle d'accès doit être héritée, Windows 2000 ou Windows NT s'occupera de propagation de l'entrée de contrôle d'accès aux objets enfants.

Il existe une exception aux règles de propagation. Les ACE ajoutés à liste de contrôle d'accès d'un objet ne seront pas automatiquement obtenir appliqués aux objets existants dans l'arborescence de la. Il incombe au programmeur de parcourir l'arborescence et propager le ACE en ajoutant l'entrée de contrôle d'accès aux objets existants. L'ACE est propagée sur nouveaux objets dans la sous-arborescence.

Algorithme de tri des entrées ACE d'une liste de contrôle d'accès

  1. Obtenir la liste de contrôle d'accès discrétionnaire (DACL) du descripteur de sécurité.
  2. Vérifiez le IADsAccessControlEntry::AceFlags pour voir si l'entrée de contrôle d'accès a été héritée (recherchez ADS_ACEFLAG_INHERITED_ACE bit).
  3. Vérifiez le IADsAccessControlEntry::AceType pour déterminer de quel type d'accès que l'ACE accorde et ce que l'accès est accordé à (l'objet lui-même ou des propriétés de l'objet). La liste suivante présente les valeurs de type ACE et leur signification :
    ADS_ACETYPE_ACCESS_ALLOWED - accorde l'accès autorisé à l'ensemble de l'objet
    ADS_ACETYPE_ACCESS_ALLOWED_OBJECT - indique l'accès est autorisé à une propriété ou un jeu de propriétés
    ADS_ACETYPE_ACCESS_DENIED - refuse l'accès à l'ensemble de l'objet
    ADS_ACETYPE_ACCESS_DENIED_OBJECT - refuse l'accès à une propriété ou un jeu de propriétés.
  4. Placez l'entrée de contrôle d'accès dans la DACL temporaire appropriée en fonction de la valeur IADsAccessControlListEntry::AceType.
  5. Reconstruire la liste de contrôle d'accès des listes de contrôle d'accès distincts dans l'ordre suivant :
    Types d'entrées de contrôle d'accès ADS_ACETYPE_ACCESS_DENIED
    Types d'entrées de contrôle d'accès ADS_ACETYPE_ACCESS_DENIED_OBJECT
    Types d'entrées de contrôle d'accès ADS_ACETYPE_ACCESS_ALLOWED
    Types d'entrées de contrôle d'accès ADS_ACETYPE_ACCESS_ALLOWED_OBJECT
    Les ACE avec indicateur ADS_ACEFLAG_INHERITED_ACE définie dans le IADsAccessControlListEntry::AceFlags
  6. Défini la nouvelle liste ACL sur le niveau de révision même que la liste de contrôle d'accès ancien.
  7. Remplacez la liste de contrôle d'accès sur le descripteur de sécurité.

Étapes pour utiliser le code Visual Basic qui est fourni dans cet article

  1. Inscrire ADsSecurity.dll.

    ADsSecurity.dll fait partie du Kit de ressources Active Directory Service Interfaces (ADSI) 2.5. Pour télécharger le kit de ressources de 2.5 ADSI, reportez-vous au site Web de Microsoft à l'adresse suivante :
    http://www.microsoft.com/technet/archive/winntas/downloads/adsi25.mspx?mfr=true
    Utilisez Regsvr32 pour inscrire ADsSecurity.dll. Si cette DLL n'inscrit pas correctement, ce problème indique que ADSI n'est pas installé. Si vous exécutez le code sur un ordinateur Microsoft Windows NT ou sur un ordinateur Microsoft Windows 98, installer l'extension de Client Directory Active approprié. Pour plus d'informations sur la façon d'obtenir ces clients, consultez la section «Références».
  2. Démarrez Visual Basic. Ensuite, créez un projet EXE standard.
  3. Afficher les références du projet. Vérifiez que le suivi sont activées :
    • Bibliothèque de types de service d'annuaire Active
    • Bibliothèque de types ADsSecurity 2.5
  4. Qu'un bouton de commande du formulaire.
  5. Double-cliquez sur le bouton de commande. Ensuite, collez le code suivant dans le Gestionnaire de commande Command1_Click.

Exemple de code Visual Basic montre comment implémenter l'algorithme de tri

Dim sec As New ADsSecurity
Dim sd As IADsSecurityDescriptor
Dim dacl As IADsAccessControlList
Dim ace As IADsAccessControlEntry
Dim newAce As New AccessControlEntry
'
' Declare temporary ACLs for sorting the original
' ACL
'
Dim newdacl As New AccessControlList
Dim ImpDenyDacl As New AccessControlList
Dim ImpDenyObjectDacl As New AccessControlList
Dim InheritedDacl As New AccessControlList
Dim ImpAllowDacl As New AccessControlList
Dim impAllowObjectDacl As New AccessControlList

Private Sub Command1_Click()
'
' Be sure to register ADsSecurity.Dll using RegSvr32 and
' adding the ADsSecurity2.5 Type Library to you references for
' the project.
'
' Using the ADsSecurity object, retrieve a SD for an object.  Just
' Replace the LDAP:// path with the path of an object that contains a
' SD.  For additional details on valid path strings, review
' the information stored in the Platform SDK ADSI samples starting with
' "<Platform SDK Root>\Samples\NetDs\ADSI\rtk.htm"
'
Set sec = CreateObject("ADsSecurity")<BR/>
' TODO :  replace the servername and DN of the object you want to modify.
Set sd = sec.GetSecurityDescriptor("LDAP://MyDCname/cn=MyUser,cn=Users,dc=MyDom,dc=com")

'Displaying the ACE in the DACL --- it's the same way you display ACEs for File, File Share, Registry, Exchange, and Active Directory's ACL.

Set dacl = sd.DiscretionaryAcl
Debug.Print Date & Time & "Initial Values of DACL"
For Each ace In dacl
   Debug.Print ace.Trustee
   Debug.Print Hex(ace.AccessMask)
   Debug.Print Hex(ace.AceType)
   Debug.Print Hex(ace.AceFlags)
   Debug.Print Hex(ace.Flags)
Next

Debug.Print dacl.AceCount

'
' Initialize all of the new ACLs
'
' If you are doing this in VBSscript you will need to use
' The following methods of creating the ACL bins instead of
' using the Dim As New statements above. 
'
'Set newAce = CreateObject("AccessControlEntry")
'Set newdacl = CreateObject("AccessControlList")
'Set InheritedDacl = CreateObject("AccessControlList")
'Set ImpAllowDacl = CreateObject("AccessControlList")
'Set InhAllowDacl = CreateObject("AccessControlList")
'Set ImpDenyObjectDacl = CreateObject("AccessControlList")
'Set ImpAllowObjectDacl = CreateObject("AccessControlList")
'
'
' Create a new ace, this one
' sets an extended right on the user object that allows the
' trustee to read and write the userAccountControl property of an
' user object.
'
' TODO : Replace the trustee with an appropriate trustee on the domain
' in question.
'
newAce.Trustee = "MyDomain\Myuser"
newAce.Flags = ADS_FLAG_OBJECT_TYPE_PRESENT
newAce.ObjectType = "{BF967A68-0DE6-11D0-A285-00AA003049E2}"
newAce.AccessMask = ADS_RIGHT_DS_READ_PROP Or ADS_RIGHT_DS_WRITE_PROP
newAce.AceType = ADS_ACETYPE_ACCESS_ALLOWED_OBJECT
newAce.AceFlags = ADS_ACEFLAG_INHERIT_ACE
'
' Place the new ace in the DACL
'
dacl.AddAce newAce
'
' Sift the DACL into 5 bins:
' Inherited Aces
' Implicit Deny Aces
' Implicit Deny Object Aces
' Implicit Allow Aces
' Implicit Allow object aces
'
For Each ace In dacl
  '
  ' Sort the original ACEs into their appropriate
  ' ACLs
  '
  Debug.Print ace.Trustee
  If ((ace.AceFlags And ADS_ACEFLAG_INHERITED_ACE) = ADS_ACEFLAG_INHERITED_ACE) Then
     '
     ' Do not really care about the order of inherited aces. Since we are
     ' adding them to the top of a new list, when they are added back
     ' to the Dacl for the object, they will be in the same order as
     ' they were originally. Just a positive side effect of adding items
     ' of a LIFO (Last In First Out) type list.
     '
     InheritedDacl.AddAce ace
  Else
     '
     ' We have an Implicit ACE, let's put it the proper pool
     '
     Select Case ace.AceType
     Case ADS_ACETYPE_ACCESS_ALLOWED
        '
        ' We have an implicit allow ace
        '
        ImpAllowDacl.AddAce ace
     Case ADS_ACETYPE_ACCESS_DENIED
        '
        ' We have an implicit Deny ACE
        '
        ImpDenyDacl.AddAce ace
     Case ADS_ACETYPE_ACCESS_ALLOWED_OBJECT
        '
        ' We have an object allowed ace
        ' Does it apply to a property? or an Object?
        '
        impAllowObjectDacl.AddAce ace
     Case ADS_ACETYPE_ACCESS_DENIED_OBJECT
        '
        ' We have an object Deny ace
        '
        ImpDenyObjectDacl.AddAce ace
     Case Else
        '
        ' Missed a bin?
        '
        Debug.Print "Bad ace...." & Hex(ace.AceType)
     End Select
  End If
Next
'
' Combine the ACEs in the proper order
' Implicit Deny
' Implicit Deny Object
' Implicit Allow
' Implicit Allow Object
' Inherited aces
'
' Implicit Deny
'
For Each ace In ImpDenyDacl
  newdacl.AddAce ace
Next
'
' Implicit Deny Object
'
For Each ace In ImpDenyObjectDacl
  newdacl.AddAce ace
Next
'
' Implicit Allow
'
For Each ace In ImpAllowDacl
  newdacl.AddAce ace
Next
'
' Implicit Allow Object
'
For Each ace In impAllowObjectDacl
  newdacl.AddAce ace
Next
'
' Inherited Aces
'
For Each ace In InheritedDacl
  newdacl.AddAce ace
Next

sd.DiscretionaryAcl = newdacl
Debug.Print Date
For Each ace In newdacl
   Debug.Print ace.Trustee
   Debug.Print "Ace Mask: " & Hex(ace.AccessMask)
   Debug.Print "Ace Type: " & Hex(ace.AceType)
   Debug.Print "Ace Flags: " & Hex(ace.AceFlags)
   Debug.Print "Object Type value: " & Hex(ace.Flags)
   Debug.Print "Object Guid : " & ace.ObjectType
Next
'
' Set the appropriate revision level
' for the DACL
'
newdacl.AclRevision = dacl.AclRevision
'
' Replace the Security Descriptor
'
sec.SetSecurityDescriptor sd
' If this generates the error -214023559 or 80070539 check your TODO
' strings.  This error is most likely a problem with DNS name resolution.
				

Références

Pour plus d'informations, cliquez sur les numéros ci-dessous pour afficher les articles correspondants dans la base de connaissances Microsoft :
269175L'utilisation de Visual C++ pour commander correctement les ACE d'une liste de contrôle d'accès
279682Comment utiliser ADsSecurity.dll pour ajouter une entrée de contrôle d'accès à un dossier NTFS
Pour plus d'informations sur la façon d'installer l'Active Directory Client Extension, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la base de connaissances Microsoft :
288358Comment faire pour installer l'extension Client Active Directory

Propriétés

Numéro d'article: 269159 - Dernière mise à jour: lundi 15 janvier 2007 - Version: 7.1
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Active Directory Service Interfaces 2.5
  • Microsoft Active Directory Service Interfaces 2.5
  • Microsoft Windows Scripting Host 2.5
Mots-clés : 
kbmt kbdswadsi2003swept kbhowto KB269159 KbMtfr
Traduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 269159
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.
Exclusion de responsabilité concernant les contenus obsolètes dans la Base de connaissances
Cet article concerne des produits pour lesquels Microsoft n'offre plus de support. Il est par conséquent fourni « en l'état » et ne sera plus mis à jour.

Envoyer des commentaires

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com