Função CreatePrivateObjectSecurityWithMultipleInheritance (securitybaseapi.h)
A função CreatePrivateObjectSecurityWithMultipleInheritance aloca e inicializa um descritor de segurança auto-relativo para um novo objeto privado criado pelo gerenciador de recursos que chama essa função. Essa função dá suporte a objetos privados (como objetos do Serviço de Diretório com classes auxiliares anexadas) compostos por vários tipos de objeto ou classes.
Sintaxe
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
Um ponteiro para o descritor de segurança para o contêiner pai do objeto. Se não houver nenhum contêiner pai, esse parâmetro será NULL.
[in, optional] CreatorDescriptor
Um ponteiro para um descritor de segurança fornecido pelo criador do objeto. Se o criador do objeto não passar explicitamente informações de segurança para o novo objeto, esse parâmetro poderá ser NULL. Como alternativa, esse parâmetro pode apontar para um descritor de segurança padrão.
[out] NewDescriptor
Um ponteiro para uma variável para receber um ponteiro para o descritor de segurança auto-relativo recém-alocado. Quando terminar de usar o descritor de segurança, libere-o chamando o
Função DestroyPrivateObjectSecurity .
[in, optional] ObjectTypes
Uma matriz de ponteiros para estruturas GUID que identificam os tipos de objeto ou classes do objeto associado a NewDescriptor. Para objetos do Active Directory, essa matriz contém ponteiros para os GUIDs de classe da classe estrutural do objeto e todas as classes auxiliares anexadas. Defina ObjectTypes como NULL se o objeto não tiver um GUID.
[in] GuidCount
O número de GUIDs presentes no parâmetro ObjectTypes .
[in] IsContainerObject
Especifica se o novo objeto pode conter outros objetos. Um valor true indica que o novo objeto é um contêiner. Um valor false indica que o novo objeto não é um contêiner.
[in] AutoInheritFlags
Um conjunto de sinalizadores de bits que controlam como as ACEs (entradas de controle de acesso ) são herdadas de ParentDescriptor. Esse parâmetro pode ser uma combinação dos seguintes valores.
Valor | Significado |
---|---|
|
A nova LISTA de controle de acesso discricionário (DACL) contém ACEs herdadas da DACL de ParentDescriptor, bem como quaisquer ACEs explícitas especificadas no DACL de CreatorDescriptor. Se esse sinalizador não estiver definido, a nova DACL não herdará ACEs. |
|
A nova lista de controle de acesso do sistema (SACL) contém ACEs herdadas do SACL de ParentDescriptor, bem como quaisquer ACEs explícitas especificadas no SACL de CreatorDescriptor. Se esse sinalizador não estiver definido, a nova SACL não herdará ACEs. |
|
CreatorDescriptor é o descritor padrão para os tipos de objetos especificados por ObjectTypes. Dessa forma, CreatorDescriptor será ignorado se ParentDescriptor tiver acEs específicos de objeto para os tipos de objetos especificados pelo parâmetro ObjectTypes . Se esses ACEs não forem herdados, CreatorDescriptor será tratado como se esse sinalizador não tivesse sido especificado. |
|
A função não executa a verificação de privilégios. Se o sinalizador SEF_AVOID_OWNER_CHECK também estiver definido, o parâmetro Token poderá ser NULL. Esse sinalizador é útil ao implementar a herança automática para evitar a verificação de privilégios em cada filho atualizado. |
|
A função não marcar a validade do proprietário no NewDescriptor resultante, conforme descrito na seção Comentários. Se o sinalizador SEF_AVOID_PRIVILEGE_CHECK também estiver definido, o parâmetro Token poderá ser NULL. |
|
O proprietário do NewDescriptor usa como padrão o proprietário de ParentDescriptor. Se não for definido, o proprietário do NewDescriptor usará como padrão o proprietário do token especificado pelo parâmetro Token . O proprietário do token é especificado no próprio token. Em ambos os casos, se o parâmetro CreatorDescriptor não for NULL, o proprietário do NewDescriptor será definido como o proprietário de CreatorDescriptor. |
|
O grupo de NewDescriptor usa como padrão o grupo de ParentDescriptor. Se não for definido, o grupo de NewDescriptor usará como padrão o grupo do token especificado pelo parâmetro Token . O grupo do token é especificado no próprio token. Em ambos os casos, se o parâmetro CreatorDescriptor não for NULL, o grupo NewDescriptor será definido como o grupo de CreatorDescriptor. |
|
Uma entidade de segurança com um nível obrigatório inferior ao do objeto não pode gravar no objeto . |
|
Uma entidade de segurança com um nível obrigatório inferior ao do objeto não pode ler o objeto. |
|
Uma entidade de segurança com um nível obrigatório inferior ao do objeto não pode executar o objeto. |
|
Todas as restrições especificadas pelo parâmetro ParentDescriptor que limitariam a capacidade do chamador de especificar uma DACL no CreatorDescriptor são ignoradas. |
[in, optional] Token
Um identificador para o token de acesso para o processo do cliente em cujo nome o objeto está sendo criado. Se esse for um token de representação, ele deverá estar no nível SecurityIdentification ou superior. Para obter uma descrição completa do nível de representação SecurityIdentification, consulte o tipo enumerado SECURITY_IMPERSONATION_LEVEL .
O token do cliente contém informações de segurança padrão, como o proprietário padrão, o grupo primário e o DACL. Essa função usará esses padrões se as informações não estiverem nos descritores de segurança de entrada. O token deve estar aberto para acesso TOKEN_QUERY .
Se todas as condições a seguir forem verdadeiras, o identificador deverá ser aberto para acesso TOKEN_DUPLICATE além de TOKEN_QUERY acesso.
- O identificador de token refere-se a um token primário.
- O descritor de segurança do token contém um ou mais ACEs com o SID OwnerRights .
- Um descritor de segurança é especificado para o parâmetro CreatorDescriptor .
- O chamador dessa função não define o sinalizador SEF_AVOID_OWNER_RESTRICTION no parâmetro AutoInheritFlags .
[in] GenericMapping
Um ponteiro para uma estrutura de GENERIC_MAPPING que especifica o mapeamento de cada direito genérico para direitos específicos para o objeto.
Retornar valor
Se a função for bem-sucedida, a função retornará um valor diferente de zero.
Se a função falhar, ela retornará zero. Chame GetLastError para obter informações de erro estendidas. Alguns códigos de erro estendidos e seus significados são listados na tabela a seguir.
Código de retorno | Descrição |
---|---|
|
A função não pode recuperar um grupo primário para o novo descritor de segurança. |
|
A função não pode recuperar um proprietário para o novo descritor de segurança ou o SID ( identificador de segurança ) não pode ser atribuído como proprietário. Isso ocorre ao validar o SID do proprietário em relação ao token passado. |
|
A função recebeu NULL em vez de um token para validação de proprietário ou verificação de privilégios . |
|
Um SACL está sendo definido, SEF_AVOID_PRIVILEGE_CHECK não foi passado e o token passado não tinha SE_SECURITY_NAME habilitado. |
Comentários
A função CreatePrivateObjectSecurityEx é idêntica à chamada da função CreatePrivateObjectSecurityWithMultipleInheritance com um único GUID em ObjectTypes.
As AutoInheritFlags são distintas dos bits nomeados da mesma forma no membro Control da estrutura SECURITY_DESCRIPTOR . Para obter uma explicação dos bits de controle, consulte SECURITY_DESCRIPTOR_CONTROL.
Se AutoInheritFlags especificar o bit SEF_DACL_AUTO_INHERIT, a função aplicará as seguintes regras à DACL no novo descritor de segurança:
- O sinalizador SE_DACL_AUTO_INHERITED é definido no membro Control do novo descritor de segurança.
- A DACL do novo descritor de segurança herda ACEs de ParentDescriptor , independentemente de CreatorDescriptor ser o descritor de segurança padrão ou ter sido explicitamente especificado pelo criador. A nova DACL é uma combinação dos DACLs pai e criador, conforme definido pelas regras de herança. Especificamente, quaisquer ACEs no ParentDescriptor herdáveis para todos os objetos filho ou para qualquer classe de objeto listada em ObjectTypes serão aplicadas à nova DACL.
- ACEs herdados são marcados como INHERITED_ACE.
Para DACLs e SACLs, determinados tipos de ACEs em ParentDescriptor e CreatorDescriptor serão manipulados e possivelmente substituídos por dois ACEs no NewDescriptor. Especificamente, um ACE herdável que contém pelo menos um dos seguintes elementos mappable pode resultar em dois ACEs no descritor de segurança de saída. Os elementos mappable incluem:
- Direitos de acesso genéricos no ACCESS_MASK
- SID do Proprietário do Criador ou SID do Grupo de Criadores como o identificador de assunto ace
- Um ACE que é uma cópia do original, mas com o sinalizador INHERIT_ONLY definido. No entanto, essa ACE não será criada se uma das duas condições a seguir existir:
- O parâmetro IsContainerObject é FALSE. ACEs herdáveis não têm sentido em objetos não pertencentes.
- O ACE original contém o sinalizador NO_PROPAGATE_INHERIT. A ACE original destina-se a ser herdada como uma ACE eficaz em crianças, mas não herdável abaixo dessas crianças.
- Um ACE eficaz no qual o bit INHERITED_ACE é ativado e os elementos genéricos são mapeados para elementos específicos:
- Os direitos de acesso genéricos são substituídos pelos direitos de acesso padrão e específicos correspondentes indicados no GenericMapping de entrada.
- O SID do Proprietário do Criador é substituído pelo Proprietário no NewDescriptor resultante
- O SID do Grupo do Criador é substituído pelo Grupo no NewDescriptor resultante
- Deve incluir SE_GROUP_OWNER
- Não deve incluir SE_GROUP_USE_FOR_DENY_ONLY
Para criar um descritor de segurança para um novo objeto, chame CreatePrivateObjectSecurityWithMultipleInheritance com ParentDescriptor definido como o descritor de segurança do contêiner pai e CreatorDescriptor definido como o descritor de segurança proposto pelo criador do objeto.
Para verificar o descritor de segurança atual em um objeto, chame CreatePrivateObjectSecurityWithMultipleInheritance com ParentDescriptor definido como o descritor de segurança do contêiner pai e CreatorDescriptor definido como o descritor de segurança atual do objeto. Essa chamada garante que os ACEs sejam herdados adequadamente de descritores de segurança pai para filho.
Se o descritor de segurança CreatorDescriptor contiver um SACL, Token deverá ter o privilégio SE_SECURITY_NAME habilitado ou o chamador deverá especificar o sinalizador SEF_AVOID_PRIVILEGE_CHECK em AutoInheritFlags.
Requisitos
Requisito | Valor |
---|---|
Cliente mínimo com suporte | Windows XP [somente aplicativos da área de trabalho] |
Servidor mínimo com suporte | Windows Server 2003 [somente aplicativos da área de trabalho] |
Plataforma de Destino | Windows |
Cabeçalho | securitybaseapi.h (inclua Windows.h) |
Biblioteca | Advapi32.lib |
DLL | Advapi32.dll |