Función SetPrivateObjectSecurityEx (securitybaseapi.h)
La función SetPrivateObjectSecurityEx modifica el descriptor de seguridad de un objeto privado mantenido por el administrador de recursos que llama a esta función. La función SetPrivateObjectSecurityEx tiene un parámetro flags que especifica si el administrador de recursos admite la herencia automática de entradas de control de acceso (ACE).
Sintaxis
BOOL SetPrivateObjectSecurityEx(
[in] SECURITY_INFORMATION SecurityInformation,
[in] PSECURITY_DESCRIPTOR ModificationDescriptor,
[in, out] PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor,
[in] ULONG AutoInheritFlags,
[in] PGENERIC_MAPPING GenericMapping,
[in, optional] HANDLE Token
);
Parámetros
[in] SecurityInformation
Partes del descriptor de seguridad que se van a establecer. Este valor puede ser una combinación de las marcas de bits de SECURITY_INFORMATION.
[in] ModificationDescriptor
Puntero a una estructura SECURITY_DESCRIPTOR . Las partes de este descriptor de seguridad indicados por el parámetro SecurityInformation se aplican al descriptor de seguridad ObjectsSecurityDescriptor .
[in, out] ObjectsSecurityDescriptor
Puntero a un puntero a una estructura de SECURITY_DESCRIPTOR . Este descriptor de seguridad debe estar en forma auto relativa . La memoria del descriptor de seguridad debe asignarse desde el montón de procesos (GetProcessHeap) con la función HeapAlloc.
En la entrada, este es el descriptor de seguridad actual del objeto privado. La función lo modifica para generar el nuevo descriptor de seguridad. Si es necesario, la función SetPrivateObjectSecurityEx asigna memoria adicional para generar un descriptor de seguridad mayor.
[in] AutoInheritFlags
Especifica la herencia automática de ACE. Si el servidor protegido no implementa la herencia automática, debe especificar cero; de lo contrario, puede especificar una combinación de los valores siguientes, definidos en Winnt.h.
Valor | Significado |
---|---|
|
La nueva lista de control de acceso discrecional (DACL) contiene ACE heredadas de la DACL del elemento primario del objeto, así como de las ACE explícitas especificadas en la DACL de ModificationDescriptor. 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 del descriptor de seguridad asociado al elemento primario del objeto, así como de las ACE explícitas especificadas en la SACL de ModificationDescriptor. Si no se establece esta marca, el nuevo SACL no hereda las ACE. |
|
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. Use esta marca 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 objeto ObjectsSecurityDescriptor resultante, como se describe en Comentarios. Si también se establece la marca SEF_AVOID_PRIVILEGE_CHECK , el parámetro Token puede ser NULL. |
|
El propietario de ObjectsSecurityDescriptor tiene como valor predeterminado el propietario del elemento primario del objeto. Si no se establece esta marca, el propietario de ObjectsSecurityDescriptor 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 ModificationDescriptor no es NULL, el propietario ObjectsSecurityDescriptor se establece en el propietario de ModificationDescriptor. |
|
El grupo de ObjectsSecurityDescriptor tiene como valor predeterminado el grupo del propietario del elemento primario del objeto. Si no se establece esta marca, el grupo de ObjectsSecurityDescriptor 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 ModificationDescriptor no es NULL, el grupo ObjectsSecurityDescriptor se establece en el grupo de ModificationDescriptor. |
|
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 propietario del elemento primario del objeto que limitarían la capacidad del autor de la llamada para especificar una DACL en objectsSecurityDescriptor . |
[in] GenericMapping
Puntero a una estructura de GENERIC_MAPPING que especifica los derechos de acceso específicos y estándar que corresponden a cada uno de los derechos de acceso genéricos.
[in, optional] Token
Identifica el token de acceso del cliente en cuyo nombre se está modificando la seguridad del objeto privado. Este parámetro es necesario para asegurarse de que el cliente ha proporcionado un valor legítimo para un nuevo identificador de seguridad de propietario (SID). El token debe estar abierto para TOKEN_QUERY acceso.
Valor devuelto
Si la función se ejecuta correctamente, la función devuelve un valor distinto de cero.
Si se produce un error en la función, devuelve cero. Para obtener información de error extendida, llame a GetLastError.
Comentarios
Si el parámetro AutoInheritFlags es cero, SetPrivateObjectSecurityEx es idéntico a la función SetPrivateObjectSecurity .
Esta función está pensada solo para que la usen los administradores de recursos. Para implementar la semántica de control de acceso estándar de Windows para actualizar los descriptores de seguridad, un administrador de recursos debe comprobar que se cumplen las condiciones siguientes antes de llamar a SetPrivateObjectSecurityEx:
- Si se establece el propietario del objeto, el proceso de llamada debe tener WRITE_OWNER permiso o ser el propietario del objeto.
- Si se establece la DACL del objeto, el proceso de llamada debe tener WRITE_DAC permiso o ser el propietario del objeto.
- Si se establece la SACL del objeto, se debe habilitar el privilegio SE_SECURITY_NAME para el proceso de llamada.
El proceso que llama a esta función no debe suplantar a un cliente porque los clientes no suelen tener los privilegios adecuados necesarios para las operaciones de token subyacentes.
Si AutoInheritFlags especifica el bit de SEF_DACL_AUTO_INHERIT, la función aplica las siguientes reglas a la DACL para crear el nuevo descriptor de seguridad a partir del descriptor actual:
- Si la marca de SE_DACL_PROTECTED no está establecida en los bits de control del descriptor de seguridad actual o del modificationDescriptor, la función construye el descriptor de seguridad de salida a partir de los ACE heredados del descriptor de seguridad actual y los ACE noheritados de ModificationDescriptor. Es decir, es imposible cambiar una ACE heredada cambiando la lista de control de acceso (ACL) en un objeto. Este comportamiento conserva los ASE heredados a medida que se heredan del contenedor primario.
Un editor de ACL debe hacer que las ACE heredadas no estén disponibles para evitar que se modifiquen.
- Si SE_DACL_PROTECTED se establece en ModificationDescriptor, se omite el descriptor de seguridad actual. El descriptor de seguridad de salida se crea como una copia de ModificationDescriptor con los bits de INHERITED_ACE desactivados.
Lo ideal es que un editor de ACL desactive los bits de INHERITED_ACE que indican a su autor de la llamada que los ACE heredan del elemento primario del objeto ahora se establecen explícitamente en el objeto .
- Si SE_DACL_PROTECTED se establece en el descriptor de seguridad actual y no en ModificationDescriptor, se omite el descriptor de seguridad actual. El descriptor de seguridad de salida se crea como una copia de ModificationDescriptor. Es responsabilidad del autor de la llamada asegurarse de que los ACE correctos tienen activado el bit de INHERITED_ACE.
Para las DACL y SACL, determinados tipos de ACL en los objetos de entradaSecurityDescriptor y en ModificationDescriptor se reemplazarán por dos ACE en el objeto ObjectsSecurityDescriptor de salida. En concreto, una ACE heredable que contenga al menos uno de los siguientes elementos asignables dará como resultado dos ACE en el objeto ObjectsSecurityDescriptor de salida. Entre los elementos asignables se incluyen:
- Derechos de acceso genéricos en la estructura de ACCESS_MASK
- SID de propietario del creador o SID del grupo de creadores como identificador del sujeto ace
- Ace que es una copia del original, pero con la marca INHERIT_ONLY establecida
- Ace en la que se activa el bit de INHERITED_ACE 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 la salida SecurityDescriptor
- El SID del grupo de creadores se reemplaza por el grupo en el securityDescriptor de salida.
- Debe ser un SID con formato legal
- Debe coincidir con TokenUser en Token
- Debe coincidir con un grupo de TokenGroups en Token donde los atributos del grupo:
- Incluir SE_GROUP_OWNER
- Incluir SE_GROUP_USE_FOR_DENY_ONLY
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
Funciones de Access Control cliente/servidor