Compartir a través de


Función CreatePrivateObjectSecurityWithMultipleInheritance (securitybaseapi.h)

La función CreatePrivateObjectSecurityWithMultipleInheritance asigna e inicializa un descriptor de seguridad auto relativo para un nuevo objeto privado creado por el administrador de recursos que llama a esta función. Esta función admite objetos privados (como objetos de servicio de directorio con clases auxiliares adjuntas) compuestos por varios tipos de objetos o clases.

Sintaxis

BOOL CreatePrivateObjectSecurityWithMultipleInheritance(
  [in, optional] PSECURITY_DESCRIPTOR ParentDescriptor,
  [in, optional] PSECURITY_DESCRIPTOR CreatorDescriptor,
  [out]          PSECURITY_DESCRIPTOR *NewDescriptor,
  [in, optional] GUID                 **ObjectTypes,
  [in]           ULONG                GuidCount,
  [in]           BOOL                 IsContainerObject,
  [in]           ULONG                AutoInheritFlags,
  [in, optional] HANDLE               Token,
  [in]           PGENERIC_MAPPING     GenericMapping
);

Parámetros

[in, optional] ParentDescriptor

Puntero al descriptor de seguridad del contenedor primario del objeto . Si no hay ningún contenedor primario, este parámetro es NULL.

[in, optional] CreatorDescriptor

Puntero a un descriptor de seguridad proporcionado por el creador del objeto. Si el creador del objeto no pasa explícitamente información de seguridad para el nuevo objeto, este parámetro puede ser NULL. Como alternativa, este parámetro puede apuntar a un descriptor de seguridad predeterminado.

[out] NewDescriptor

Puntero a una variable para recibir un puntero al descriptor de seguridad autodirección recién asignado. Cuando haya terminado de usar el descriptor de seguridad, puede liberarlo llamando a .
Función DestroyPrivateObjectSecurity .

[in, optional] ObjectTypes

Matriz de punteros a estructuras GUID que identifican los tipos de objeto o las clases del objeto asociado a NewDescriptor. Para los objetos de Active Directory, esta matriz contiene punteros a los GUID de clase de la clase estructural del objeto y a todas las clases auxiliares adjuntas. Establezca ObjectTypes en NULL si el objeto no tiene un GUID.

[in] GuidCount

Número de GUID presentes en el parámetro ObjectTypes .

[in] IsContainerObject

Especifica si el nuevo objeto puede contener otros objetos. Un valor true indica que el nuevo objeto es un contenedor. Un valor false indica que el nuevo objeto no es un contenedor.

[in] AutoInheritFlags

Un conjunto de marcas de bits que controlan cómo se heredan las entradas de control de acceso (ACE) de ParentDescriptor. Este parámetro puede ser una combinación de los valores siguientes.

Value Significado
SEF_DACL_AUTO_INHERIT
0x01
La nueva lista de control de acceso discrecional (DACL) contiene ACE heredadas de la DACL de ParentDescriptor, así como de las ACE explícitas especificadas en la DACL de CreatorDescriptor. Si no se establece esta marca, la nueva DACL no hereda las ACE.
SEF_SACL_AUTO_INHERIT
0x02
La nueva lista de control de acceso del sistema (SACL) contiene ACE heredadas de la SACL de ParentDescriptor, así como de las ACE explícitas especificadas en la SACL de CreatorDescriptor. Si no se establece esta marca, el nuevo SACL no hereda las ACE.
SEF_DEFAULT_DESCRIPTOR_FOR_OBJECT
0x04
CreatorDescriptor es el descriptor predeterminado para los tipos de objetos especificados por ObjectTypes. Por lo tanto, CreatorDescriptor se omite si ParentDescriptor tiene cualquier ACE específica del objeto para los tipos de objetos especificados por el parámetro ObjectTypes . Si no se hereda este tipo de ACE, CreatorDescriptor se controla como si no se especificara esta marca.
SEF_AVOID_PRIVILEGE_CHECK
0x08
La función no realiza la comprobación de privilegios. Si también se establece la marca SEF_AVOID_OWNER_CHECK, el parámetro Token puede ser NULL. Esta marca es útil al implementar la herencia automática para evitar comprobar los privilegios en cada elemento secundario actualizado.
SEF_AVOID_OWNER_CHECK
0x10
La función no comprueba la validez del propietario en el NewDescriptor resultante, tal como se describe en la sección Comentarios. Si también se establece la marca SEF_AVOID_PRIVILEGE_CHECK, el parámetro Token puede ser NULL.
SEF_DEFAULT_OWNER_FROM_PARENT
0x20
El propietario de NewDescriptor tiene como valor predeterminado el propietario de ParentDescriptor. Si no se establece, el propietario de NewDescriptor tiene como valor predeterminado el propietario del token especificado por el parámetro Token . El propietario del token se especifica en el propio token. En cualquier caso, si el parámetro CreatorDescriptor no es NULL, el propietario de NewDescriptor se establece en el propietario de CreatorDescriptor.
SEF_DEFAULT_GROUP_FROM_PARENT
0x40
El grupo de NewDescriptor tiene como valor predeterminado el grupo de ParentDescriptor. Si no se establece, el grupo de NewDescriptor tiene como valor predeterminado el grupo del token especificado por el parámetro Token . El grupo del token se especifica en el propio token. En cualquier caso, si el parámetro CreatorDescriptor no es NULL, el grupo NewDescriptor se establece en el grupo desde CreatorDescriptor.
SEF_MACL_NO_WRITE_UP
0x100
Una entidad de seguridad con un nivel obligatorio inferior al del objeto no puede escribir en el objeto .
SEF_MACL_NO_READ_UP
0x200
Una entidad de seguridad con un nivel obligatorio inferior al del objeto no puede leer el objeto.
SEF_MACL_NO_EXECUTE_UP
0x400
Una entidad de seguridad con un nivel obligatorio inferior al del objeto no puede ejecutar el objeto .
SEF_AVOID_OWNER_RESTRICTION
0x1000
Se omiten las restricciones especificadas por el parámetro ParentDescriptor que limitarían la capacidad del autor de la llamada para especificar una DACL en CreatorDescriptor .

[in, optional] Token

Identificador del token de acceso para el proceso de cliente en cuyo nombre se crea el objeto. Si se trata de un token de suplantación, debe estar en el nivel SecurityIdentification o superior. Para obtener una descripción completa del nivel de suplantación SecurityIdentification, consulte el SECURITY_IMPERSONATION_LEVEL tipo enumerado.

El token de cliente contiene información de seguridad predeterminada, como el propietario predeterminado, el grupo principal y DACL. Esta función usa estos valores predeterminados si la información no está en los descriptores de seguridad de entrada. El token debe estar abierto para TOKEN_QUERY acceso.

Si se cumplen todas las condiciones siguientes, el identificador debe abrirse para TOKEN_DUPLICATE acceso además de TOKEN_QUERY acceso.

  • El identificador de token hace referencia a un token principal.
  • El descriptor de seguridad del token contiene uno o varios ACE con el SID OwnerRights .
  • Se especifica un descriptor de seguridad para el parámetro CreatorDescriptor .
  • El autor de la llamada de esta función no establece la marca SEF_AVOID_OWNER_RESTRICTION en el parámetro AutoInheritFlags .

[in] GenericMapping

Puntero a una estructura de GENERIC_MAPPING que especifica la asignación de cada derecho genérico a derechos específicos para el objeto.

Valor devuelto

Si la función se realiza correctamente, la función devuelve un valor distinto de cero.

Si se produce un error en la función, devuelve cero. Llame a GetLastError para obtener información de error extendida. Algunos códigos de error extendidos y sus significados se enumeran en la tabla siguiente.

Código devuelto Descripción
ERROR_INVALID_PRIMARY_GROUP
La función no puede recuperar un grupo principal para el nuevo descriptor de seguridad.
ERROR_INVALID_OWNER
La función no puede recuperar un propietario para el nuevo descriptor de seguridad o el identificador de seguridad (SID) no se puede asignar como propietario. Esto se produce al validar el SID de propietario con el token pasado.
ERROR_NO_TOKEN
La función recibió NULL en lugar de un token para la validación del propietario o la comprobación de privilegios .
ERROR_PRIVILEGE_NOT_HELD
Se establece una SACL, SEF_AVOID_PRIVILEGE_CHECK no se pasó y el token pasado no tenía SE_SECURITY_NAME habilitado.

Comentarios

La función CreatePrivateObjectSecurityEx es idéntica a llamar a la función CreatePrivateObjectSecurityWithMultipleInheritance con un único GUID en ObjectTypes.

AutoInheritFlags son distintos de los bits con nombre similar del miembro Control de la estructura SECURITY_DESCRIPTOR. Para obtener una explicación de los bits de control, consulte SECURITY_DESCRIPTOR_CONTROL.

Si AutoInheritFlags especifica el bit de SEF_DACL_AUTO_INHERIT, la función aplica las siguientes reglas a la DACL en el nuevo descriptor de seguridad:

  • La marca SE_DACL_AUTO_INHERITED se establece en el miembro Control del nuevo descriptor de seguridad.
  • La DACL del nuevo descriptor de seguridad hereda las ACE de ParentDescriptor , independientemente de si CreatorDescriptor es el descriptor de seguridad predeterminado o el creador especificó explícitamente. La nueva DACL es una combinación de las DACL primarias y creadores, tal y como se define en las reglas de herencia. En concreto, cualquier ACA de ParentDescriptor que se pueda heredar a todos los objetos secundarios o a cualquier clase de objeto enumerada en ObjectTypes se aplicará a la nueva DACL.
  • Las ACE heredadas se marcan como INHERITED_ACE.
Si AutoInheritFlags especifica el bit de SEF_SACL_AUTO_INHERIT, la función aplica reglas similares a la nueva SACL.

En el caso de las DACL y las SACL, ciertos tipos de ACL en ParentDescriptor y CreatorDescriptor se manipularán y posiblemente se reemplazarán por dos ACE en NewDescriptor. En concreto, una ACE heredable que contiene al menos uno de los siguientes elementos asignables puede dar lugar a dos ACE en el descriptor de seguridad de salida. Entre los elementos asignables se incluyen:

  • Derechos de acceso genéricos en el ACCESS_MASK
  • SID de propietario del creador o SID del grupo de creadores como identificador del firmante ace
Los ASE con cualquiera de estos elementos asignables darán lugar a las dos ACE siguientes en NewDescriptor:
  • Ace que es una copia del original, pero con la marca INHERIT_ONLY establecida. Sin embargo, esta ACE no se creará si existe alguna de las dos condiciones siguientes:
    • El parámetro IsContainerObject es FALSE. Los AEC heredables no tienen sentido en objetos que no son de contenedor.
    • La ACE original contiene la marca NO_PROPAGATE_INHERIT. La ACE original está pensada para ser heredada como una ACE eficaz en los elementos secundarios, pero no se pueden heredar por debajo de esos elementos secundarios.
  • Ace eficaz en la que el bit de INHERITED_ACE está activado y los elementos genéricos se asignan a elementos específicos:
    • Los derechos de acceso genéricos se reemplazan por los derechos de acceso estándar y específicos correspondientes indicados en la entrada GenericMapping.
    • El SID del propietario del creador se reemplaza por el propietario en el elemento NewDescriptor resultante.
    • El SID del grupo de creadores se reemplaza por el grupo en el nuevodescriptor resultante.
Si AutoInheritFlags no especifica el bit de SEF_AVOID_OWNER_CHECK, la comprobación de validez del propietario se realiza según las reglas siguientes. El propietario del newDescriptor resultante debe ser un SID con formato legal y debe coincidir con el tokenUser en Token o debe coincidir con un grupo en tokenGroups en Token. Atributos del grupo:
  • Debe incluir SE_GROUP_OWNER
  • No debe incluir SE_GROUP_USE_FOR_DENY_ONLY
Los autores de llamadas que no tienen acceso al token del cliente que, en última instancia, establecerán el propietario pueden optar por omitir la comprobación de validación del propietario.

Para crear un descriptor de seguridad para un nuevo objeto, llame a CreatePrivateObjectSecurityWithMultipleInheritance con ParentDescriptor establecido en el descriptor de seguridad del contenedor primario y CreatorDescriptor establecido en el descriptor de seguridad propuesto por el creador del objeto.

Para comprobar el descriptor de seguridad actual en un objeto, llame a CreatePrivateObjectSecurityWithMultipleInheritance con ParentDescriptor establecido en el descriptor de seguridad del contenedor primario y CreatorDescriptor establecido en el descriptor de seguridad actual del objeto. Esta llamada garantiza que los ASE se heredan adecuadamente de los descriptores de seguridad primarios a secundarios.

Si el descriptor de seguridad CreatorDescriptor contiene una SACL, Token debe tener habilitado el privilegio SE_SECURITY_NAME o el autor de la llamada debe especificar la marca de SEF_AVOID_PRIVILEGE_CHECK en AutoInheritFlags.

Requisitos

Requisito Value
Cliente mínimo compatible Windows XP [solo aplicaciones de escritorio]
Servidor mínimo compatible Windows Server 2003 [solo aplicaciones de escritorio]
Plataforma de destino Windows
Encabezado securitybaseapi.h (incluya Windows.h)
Library Advapi32.lib
Archivo DLL Advapi32.dll

Consulte también

CreatePrivateObjectSecurityEx

DestroyPrivateObjectSecurity

GENERIC_MAPPING

GUID

SECURITY_DESCRIPTOR

SECURITY_DESCRIPTOR_CONTROL

SECURITY_IMPERSONATION_LEVEL