Administración del descriptor de seguridad

No todas las tareas se pueden realizar modificando los atributos de un objeto. A veces, es necesario modificar el descriptor de seguridad de un objeto. Por ejemplo, de manera predeterminada, un usuario normal puede leer la mayoría de sus atributos, pero no modificarlos. Es posible que desee permitir a un usuario leer y escribir su número de teléfono. Esto se logra agregando una entrada de control de acceso (ACE) a la lista de control de acceso discrecional (DACL) del objeto de usuario. Esta ACE es una ACE permitida que concede acceso de escritura a la propiedad telephoneNumber. Para obtener más información sobre la propiedad telephoneNumber, vea los temas telephoneNumber o Telephone-Number en la biblioteca de MSDN en https://go.microsoft.com/fwlink/?LinkID=27252.

En la versión 1.0 y 1.1 de .NET Framework, no existe compatibilidad nativa para modificar los descriptores de seguridad de objetos de Active Directory. El descriptor de seguridad de un objeto de Active Directory se puede manipular mediante la invocación de ADSI y el uso de IADsSecurityDescriptor y sus interfaces asociadas. Para obtener más información, vea Invocar ADSI. Para obtener más información sobre la interfaz IADsSecurityDescriptor, vea el tema IADsSecurityDescriptor en la biblioteca de MSDN en https://go.microsoft.com/fwlink/?LinkID=27252.

En .NET Framework 2.0, el espacio de nombres System.DirectoryServices contiene varias clases para permitir la manipulación de un descriptor de seguridad sin la necesidad de invocar ADSI. La clase principal utilizada con los descriptores de seguridad de objetos de Active Directory es ActiveDirectorySecurity. Puede obtener un objeto ActiveDirectorySecurity que representa el descriptor de seguridad de un objeto de Active Directory con la propiedad ObjectSecurity.

La clase ActiveDirectorySecurity cuenta con métodos y propiedades que permiten leer y modificar la lista de control de acceso discrecional y la lista de control de acceso secundaria.

Una entrada de control de acceso en una lista de control de acceso discrecional se denomina regla de acceso. La clase principal que representa una regla de acceso es la clase ActiveDirectoryAccessRule. También existen varias clases que se derivan de la clase ActiveDirectoryAccessRule y que se utilizan para representar tipos específicos de reglas de acceso. En la siguiente tabla se enumeran estas clases concretas y sus usos.

Class Uso

CreateChildAccessRule

Representa una regla de acceso utilizada para conceder o denegar a un objeto de Active Directory el derecho de crear objetos secundarios.

DeleteChildAccessRule

Representa una regla de acceso utilizada para conceder o denegar a un objeto de Active Directory el derecho de eliminar objetos secundarios.

DeleteTreeAccessRule

Representa una regla de acceso utilizada para conceder o denegar a un objeto de Active Directory el derecho de eliminar todos los objetos secundarios.

ExtendedRightAccessRule

Representa una regla de acceso utilizada para conceder o denegar un derecho extendido a un objeto de Active Directory.

ListChildrenAccessRule

Representa una regla de acceso utilizada para conceder o denegar a un objeto de Active Directory el derecho de enumerar objetos secundarios.

PropertyAccessRule

Representa una regla de acceso utilizada para conceder o denegar el acceso a una propiedad de Active Directory.

PropertySetAccessRule

Representa una regla de acceso utilizada para conceder o denegar el acceso a un conjunto de propiedades de Active Directory.

Una entrada de control de acceso en una lista de control de acceso del sistema se denomina regla de auditoría y se representa mediante la clase ActiveDirectoryAuditRule.

En muchos casos, no resulta práctico agregar una regla de acceso a cada objeto individual para conceder o denegar el acceso a algo. En estos casos, es mejor modificar el descriptor de seguridad del contenedor y hacer heredable la regla de acceso. Esto también garantiza que cuando se creen los nuevos objetos, éstos obtendrán automáticamente los permisos adecuados. En el ejemplo de telephoneNumber proporcionado anteriormente, es recomendable conceder a todos los usuarios el permiso de escritura en sus números de teléfono. El modo más fácil de hacer esto es agregar una regla de acceso heredable a un contenedor, como una unidad organizativa, donde colocar a todos los usuarios. En los ejemplos de código siguientes se muestra cómo hacerlo.

Ejemplo

En el siguiente ejemplo de Visual Basic .NET se muestra cómo agregar una regla de acceso a un contenedor que proporcionará a todos los objetos secundarios del contenedor que sean objetos de usuario acceso de escritura a la propiedad telephoneNumber. Para obtener más información sobre la propiedad telephoneNumber, vea los temas telephoneNumber o Telephone-Number en la biblioteca de MSDN en 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

En el siguiente ejemplo de C# se muestra cómo agregar una regla de acceso a un contenedor que proporcionará a todos los objetos secundarios del contenedor que sean objetos de usuario acceso de escritura a la propiedad telephoneNumber. Para obtener más información sobre la propiedad telephoneNumber, vea los temas telephoneNumber o Telephone-Number en la biblioteca de MSDN en 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.
    }
}

Consulte también

Referencia

System.DirectoryServices
ActiveDirectorySecurity
ActiveDirectoryAccessRule
ActiveDirectoryAuditRule

Conceptos

Tareas de administración del sistema

Send comments about this topic to Microsoft.

Copyright © 2007 Microsoft Corporation. Reservados todos los derechos.