Establecer derechos de acceso en un objeto

Cuando se usan los objetos COM ADSI IADsSecurityDescriptor (descriptor de seguridad), IADsAccessControlList (DACLs y SACLs) e IADsAccessControlEntry (ACE) para agregar una ACE a una ACL, se realizan cambios en la propiedad nTSecurityDescriptor del objeto especificado en la memoria caché de propiedades. Esto significa que se deben llamar a los métodos put en los objetos que contienen la nueva ACE y el método IADs.SetInfo para escribir el descriptor de seguridad actualizado en el directorio desde la memoria caché de propiedades.

Para obtener más información y un ejemplo de código que establece una ACE en un objeto de Servicios de dominio de Active Directory, vea Ejemplo de código para establecer una ACE en un objeto de directorio.

Use el siguiente proceso general para crear una ACE para un derecho de acceso y establecer esa ACE en la DACL de un objeto.

  1. Obtiene un puntero de interfaz de IADs al objeto .

  2. Use el método IADs.Get para obtener el descriptor de seguridad del objeto. El nombre de la propiedad que contiene el descriptor de seguridad es nTSecurityDescriptor. La propiedad se devolverá como variant que contiene un puntero IDispatch (el miembro vt es VT_DISPATCH). Llame a QueryInterface en ese puntero IDispatch para obtener una interfaz IADsSecurityDescriptor para usar los métodos de esa interfaz para acceder a la ACL del descriptor de seguridad.

  3. Utilice la propiedad IADsSecurityDescriptor.DiscretionaryAcl para obtener la DACL. El método devuelve un puntero IDispatch . Llame a QueryInterface en ese puntero IDispatch para obtener una interfaz IADsAccessControlList para usar los métodos de esa interfaz para acceder a las ACE individuales de la ACL.

  4. Use CoCreateInstance para crear el objeto COM ADSI para la nueva ACE y obtener un puntero de interfaz IADsAccessControlEntry a ese objeto. Tenga en cuenta que el identificador de clase es CLSID_AccessControlEntry.

  5. Establezca las propiedades de la ACE mediante los métodos IADsAccessControlEntry :

    1. Use IADsAccessControlEntry::p ut_Trustee para establecer el administrador de confianza en el que se aplica esta ACE. El administrador de confianza es un usuario, grupo u otra entidad de seguridad. La aplicación debe usar el valor de la propiedad adecuada del objeto de usuario o grupo del administrador de confianza al que desea aplicar la ACE. El administrador de confianza se especifica como BSTR y puede adoptar las siguientes formas:
      • Cuenta de dominio (el nombre de inicio de sesión usado en una versión anterior de Windows NT) con el formato "<domain>\<user account>" donde "<domain>" es el nombre del dominio de Windows NT que contiene el usuario y "<user account>" es la propiedad sAMAccountName del usuario especificado. Por ejemplo: "fabrikam\jeffsmith".
      • Entidad de seguridad conocida que representa identidades especiales definidas por el sistema de seguridad de Windows NT, como todos, el sistema local, la entidad de seguridad, el usuario autenticado, el propietario del creador, etc. Los objetos que representan las entidades de seguridad conocidas se almacenan en el contenedor De entidades de seguridad conocidas debajo del contenedor De configuración. Por ejemplo, inicio de sesión anónimo.
      • Grupo integrado que representa los grupos de usuarios integrados definidos por el sistema de seguridad de Windows NT. Tiene el formato "BUILTIN\<group name>" donde "<group name>" es el nombre del grupo de usuarios integrado. Los objetos que representan los grupos integrados se almacenan en el contenedor Builtin debajo del contenedor de dominio. Por ejemplo, "BUILTIN\Administrators".
      • SID (formato de cadena) del usuario especificado, que es la propiedad objectSID del usuario especificado. Puede convertir en formulario de cadena mediante la función ConvertSidToStringSid en la API para seguridad Win32. Por ejemplo: "S-1-5-32-548".
    2. Utilice la propiedad IADsAccessControlEntry.AccessMask para establecer la máscara que especifica el derecho de acceso. La enumeración ADS_RIGHTS_ENUM especifica los derechos de acceso que puede establecer en un objeto de directorio.
    3. Use la propiedad IADsAccessControlEntry.AceType para especificar si se permiten o deniegan los derechos de acceso establecidos por AccessMask. Para los derechos estándar, esto puede ser ADS_ACETYPE_ACCESS_ALLOWED o ADS_ACETYPE_ACCESS_DENIED. Para los derechos específicos del objeto (derechos que se aplican a una parte específica de un objeto o a un tipo específico de objeto), use ADS_ACETYPE_ACCESS_ALLOWED_OBJECT o ADS_ACETYPE_ACCESS_DENIED_OBJECT. La enumeración ADS_ACETYPE_ENUM especifica los tipos de acceso que puede establecer en una ACE.
    4. Utilice la propiedad IADsAccessControlEntry.AceFlags para especificar si otros contenedores u objetos debajo del objeto especificado pueden heredar la ACE. La enumeración ADS_ACEFLAG_ENUM especifica las marcas de herencia que puede establecer en una ACE.
    5. Utilice la propiedad IADsAccessControlEntry.Flags para especificar si el derecho se aplica a una parte específica del objeto, un tipo de objeto heredado o ambos.
    6. Si Flags se establece en ADS_FLAG_OBJECT_TYPE_PRESENT, establezca la propiedad IADsAccessControlEntry.ObjectType o especifique una cadena que contenga el GUID de la clase de objeto (para ADS_RIGHT_DS_CREATE_CHILD o ADS_RIGHT_DS_DELETE_CHILD), propiedad, conjunto de propiedades, escritura validada o derecho extendido al que se aplica la ACE. El GUID debe especificarse como una cadena del formulario generado por la función StringFromGUID2 en la biblioteca COM.
    7. Si Flags se establece en ADS_FLAG_INHERITED_OBJECT_TYPE_PRESENT, establezca la propiedad IADsAccessControlEntry.InheritedObjectType para especificar una cadena que contenga el GUID de la clase de objeto heredada a la que se aplica la ACE. El GUID debe especificarse como una cadena del formulario generado por la función StringFromGUID2 en la biblioteca COM.
  6. Utilice el método QueryInterface en el objeto IADsAccessControlEntry para obtener un puntero IDispatch . El método IADsAccessControlList.AddAce requiere un puntero de interfaz IDispatch a la ACE.

  7. Use IADsAccessControlList.AddAce para agregar la nueva ACE a la DACL. Tenga en cuenta que el orden de las ACE dentro de la ACL puede afectar a la evaluación del acceso al objeto. El acceso correcto al objeto puede requerir que cree una nueva ACL, agregue los ACL desde la ACL existente en el orden correcto a la nueva ACL y, a continuación, reemplace la ACL existente en el descriptor de seguridad por la nueva ACL. Para obtener más información, vea Order of ACEs in a DACL.

  8. Utilice la propiedad IADsSecurityDescriptor.DiscretionaryAcl para escribir la DACL que contiene la nueva ACE en el descriptor de seguridad. Para obtener más información sobre las DACL, vea DACL null y DACL vacías.

  9. Use el método IADs.Put para escribir el descriptor de seguridad en la propiedad nTSecurityDescriptor del objeto en la memoria caché de propiedades.

  10. Use el método IADs.SetInfo para actualizar la propiedad en el objeto del directorio.