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 |
---|---|
|
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. |
|
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. |
|
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. |
|
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. |
|
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. |
|
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. |
|
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. |
|
Una entidad de seguridad con un nivel obligatorio inferior al del objeto no puede escribir en el objeto . |
|
Una entidad de seguridad con un nivel obligatorio inferior al del objeto no puede leer el objeto. |
|
Una entidad de seguridad con un nivel obligatorio inferior al del objeto no puede ejecutar el objeto . |
|
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 |
---|---|
|
La función no puede recuperar un grupo principal para el nuevo descriptor de seguridad. |
|
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. |
|
La función recibió NULL en lugar de un token para la validación del propietario o la comprobación de privilegios . |
|
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.
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
- 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.
- Debe incluir SE_GROUP_OWNER
- No debe incluir SE_GROUP_USE_FOR_DENY_ONLY
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 |