Partager via


Gestion du descripteur de sécurité

Toutes les tâches ne peuvent pas être effectuées en modifiant les attributs d'un objet. Il est parfois nécessaire de modifier le descripteur de sécurité d'un objet. Par exemple, le comportement par défaut veut qu'un utilisateur standard puisse lire la plupart de ses attributs, mais ne puisse pas les modifier. Vous voudrez peut-être autoriser un utilisateur à lire et à écrire son numéro de téléphone. Pour cela, vous devez ajouter une entrée de contrôle d'accès (ACE, Access Control Entry) à la liste de contrôle d'accès discrétionnaire (DACL, Discretionary Access Control List) de l'objet utilisateur. Cette ACE autorise un accès en écriture à la propriété telephoneNumber. Pour plus d'informations sur la propriété telephoneNumber, voir la rubrique telephoneNumber ou Telephone-Number dans MSDN Library à l'adresse https://go.microsoft.com/fwlink/?LinkID=27252.

Dans les versions 1.0 et 1.1 de .NET Framework, il n'existe pas de prise en charge native pour la modification des descripteurs de sécurité des objets Active Directory. Le descripteur de sécurité d'un objet Active Directory peut être manipulé en appelant l'interface ADSI et en utilisant IADsSecurityDescriptor et les interfaces associées. Pour plus d'informations, voir Appel d'ADSI. Pour plus d'informations sur l'interface IADsSecurityDescriptor, voir la rubrique IADsSecurityDescriptor dans MSDN Library à l'adresse https://go.microsoft.com/fwlink/?LinkID=27252.

Dans .NET Framework 2.0, l'espace de noms System.DirectoryServices contient différentes classes permettant de manipuler un descripteur de sécurité sans appeler l'interface ADSI. La classe principale utilisée avec les descripteurs de sécurité des objets Active Directory est ActiveDirectorySecurity. Vous pouvez obtenir un objet ActiveDirectorySecurity qui représente le descripteur de sécurité d'un objet Active Directory avec la propriété ObjectSecurity.

Certaines méthodes et propriétés de la classe ActiveDirectorySecurity permettent de lire et de modifier la liste de contrôle d'accès discrétionnaire et la liste de contrôle d'accès secondaire d'un objet.

Une entrée de contrôle d'accès d'une liste de contrôle d'accès discrétionnaire s'appelle une règle d'accès. La classe principale qui représente une règle d'accès est la classe ActiveDirectoryAccessRule. Plusieurs classes dérivées de la classe ActiveDirectoryAccessRule sont également utilisées pour représenter des types spécifiques de règles d'accès. Le tableau suivant répertorie ces classes spécifiques et leur utilisation.

Classe Utilisation

CreateChildAccessRule

Représente une règle d'accès utilisée pour autoriser ou non un objet Active Directory à créer des objets enfants.

DeleteChildAccessRule

Représente une règle d'accès utilisée pour autoriser ou non un objet Active Directory à supprimer des objets enfants.

DeleteTreeAccessRule

Représente une règle d'accès utilisée pour autoriser ou non un objet Active Directory à supprimer tous les objets enfants.

ExtendedRightAccessRule

Représente une règle d'accès utilisée pour accorder ou refuser à un objet Active Directory un droit étendu.

ListChildrenAccessRule

Représente une règle d'accès utilisée pour autoriser ou non un objet Active Directory à lister les objets enfants.

PropertyAccessRule

Représente une règle d'accès utilisée pour accorder ou refuser l'accès à une propriété Active Directory.

PropertySetAccessRule

Représente une règle d'accès utilisée pour accorder ou refuser l'accès à un jeu de propriétés Active Directory.

Une entrée de contrôle d'accès d'une liste de contrôle d'accès système s'appelle une règle d'audit. Elle est représentée par la classe ActiveDirectoryAuditRule.

Dans de nombreux cas, il n'est pas pratique d'ajouter une règle d'accès à chaque objet afin d'autoriser ou de refuser un accès. Il est alors préférable de modifier le descripteur de sécurité du conteneur et de faire en sorte que la règle d'accès puisse être héritée. Cela permet aussi de s'assurer que lorsque des objets sont créés, ils obtiennent automatiquement les autorisations appropriées. Dans l'exemple telephoneNumber précédent, vous voudrez peut-être accorder à tous les utilisateurs un accès en écriture à leur numéro de téléphone. Pour cela, le moyen le plus simple est d'ajouter une règle d'accès héritable à un conteneur, par exemple une unité d'organisation, et de placer tous les utilisateurs dans cette unité d'organisation. Les exemples de code suivants illustrent cette méthode.

Exemple

L'exemple Visual Basic .NET ci-dessous indique comment ajouter à un conteneur une règle d'accès qui accordera à tous les enfants du conteneur qui sont des objets utilisateur un accès en écriture à la propriété telephoneNumber. Pour plus d'informations sur la propriété telephoneNumber, voir la rubrique telephoneNumber ou Telephone-Number dans MSDN Library à l'adresse https://go.microsoft.com/fwlink/?LinkID=27252.

Sub SetWritePhonePermission(ByVal container As DirectoryEntry)
    Try
        ' Get the ActiveDirectorySecurity for the container.
        Dim containerSecurity As ActiveDirectorySecurity
        containerSecurity = container.ObjectSecurity

        ' Create a SecurityIdentifier object for "self".
        Dim selfSid As New SecurityIdentifier(WellKnownSidType.SelfSid, _
            Nothing)

        ' Get the schema for the currently logged on user.
        Dim schema As ActiveDirectorySchema
        schema = ActiveDirectorySchema.GetCurrentSchema()

        ' Get the telephoneNumber schema property object.
        Dim phoneProperty As ActiveDirectorySchemaProperty
        phoneProperty = schema.FindProperty("telephoneNumber")

        ' Get the user schema class object.
        Dim userClass As ActiveDirectorySchemaClass
        userClass = schema.FindClass("user")

        ' Create a property access rule to allow a user to write to their own telephoneNumber property.
        Dim allowWritePhoneRule As New PropertyAccessRule(selfSid, _
            AccessControlType.Allow, _
            PropertyAccess.Write, _
            phoneProperty.SchemaGuid, _
            ActiveDirectorySecurityInheritance.Descendents, _
            userClass.SchemaGuid)

        ' Add the access rule to the DACL.
        container.ObjectSecurity.AddAccessRule(allowWritePhoneRule)

        ' Commit the changes.
        container.CommitChanges()

    Catch notFoundEx As ActiveDirectoryObjectNotFoundException
        ' The schema class or property could not be found.
    End Try

End Sub 'SetWritePhonePermission

L'exemple C# suivant indique comment ajouter à un conteneur une règle d'accès qui accordera à tous les enfants du conteneur qui sont des objets utilisateur un accès en écriture à la propriété telephoneNumber. Pour plus d'informations sur la propriété telephoneNumber, voir la rubrique telephoneNumber ou Telephone-Number dans MSDN Library à l'adresse https://go.microsoft.com/fwlink/?LinkID=27252.

static void SetWritePhonePermission(DirectoryEntry container)
{
    try
    {
        // Get the ActiveDirectorySecurity for the container.
        ActiveDirectorySecurity containerSecurity = container.ObjectSecurity;

        // Create a SecurityIdentifier object for "self".
        SecurityIdentifier selfSid =
            new SecurityIdentifier(WellKnownSidType.SelfSid, null);

        // Get the schema for the currently logged on user.
        ActiveDirectorySchema schema = ActiveDirectorySchema.GetCurrentSchema();

        // Get the telephoneNumber schema property object.
        ActiveDirectorySchemaProperty phoneProperty = schema.FindProperty("telephoneNumber");

        // Get the user schema class object.
        ActiveDirectorySchemaClass userClass = schema.FindClass("user");

        // Create a property access rule to allow a user to write to their own telephoneNumber property.
        PropertyAccessRule allowWritePhoneRule =
            new PropertyAccessRule(
                selfSid,
                AccessControlType.Allow,
                PropertyAccess.Write,
                phoneProperty.SchemaGuid,
                ActiveDirectorySecurityInheritance.Descendents,
                userClass.SchemaGuid);

        // Add the access rule to the DACL.
        container.ObjectSecurity.AddAccessRule(allowWritePhoneRule);

        // Commit the changes.
        container.CommitChanges();
    }
    catch (ActiveDirectoryObjectNotFoundException)
    {
        // The schema class or property could not be found.
    }
}

Voir aussi

Référence

System.DirectoryServices
ActiveDirectorySecurity
ActiveDirectoryAccessRule
ActiveDirectoryAuditRule

Concepts

Tâches d'administration du système

Send comments about this topic to Microsoft.

Copyright © 2007 par Microsoft Corporation. Tous droits réservés.