Lendo um conjunto de direitos de acesso de controle na ACL de um objeto
Usando ADSI, você lê uma ACE de acesso de controle como faria com qualquer outra ACE em uma ACL. Lembre-se de que você também pode usar as APIs de segurança do Win32 para ler ACLs em objetos de diretório. No entanto, os direitos de acesso de controle usam as propriedades da interface IADsAccessControlEntry de uma maneira específica para conceder e negar direitos de acesso de controle:
- AccessMask deve conter ADS_RIGHT_DS_CONTROL_ACCESS.
- O valor dos sinalizadores é ADS_FLAG_OBJECT_TYPE_PRESENT.
- ObjectType é a forma de cadeia de caracteres do atributo rightsGUID do direito de acesso de controle. O formato de cadeia de caracteres do GUID é o mesmo formato de cadeia de caracteres que a função Biblioteca COM StringFromGUID2.
- O AceType é ADS_ACETYPE_ACCESS_ALLOWED_OBJECT conceder ao administrador o direito de acesso de controle ou ADS_ACETYPE_ACCESS_DENIED_OBJECT negar ao administrador o direito de acesso de controle.
- Trustee é a entidade de segurança, ou seja, o usuário, grupo, computador e assim por diante, ao qual a ACE se aplica.
Use o procedimento a seguir para ler uma ACE para um objeto ADSI. O procedimento a seguir se aplica a aplicativos C e C++.
Para ler uma ACE para um objeto ADSI
- Obtenha um ponteiro de interface de IADs para o objeto.
- Use o método IADs::Get para obter o descritor de segurança do objeto. O nome da propriedade que contém o descritor de segurança é "nTSecurityDescriptor". A propriedade será retornada como uma VARIANT que contém um ponteiro IDispatch. Esteja ciente de que o membro vt é VT_DISPATCH. Chame QueryInterface nesse ponteiro IDispatch para obter uma interface IADsSecurityDescriptor para usar os métodos nessa interface para acessar a ACL do descritor de segurança.
- Use o método IADsSecurityDescriptor::get_DiscretionaryAcl para obter a ACL. O método retorna um ponteiro IDispatch. Chame QueryInterface nesse ponteiro IDispatch para obter uma interface IADsAccessControlList para usar os métodos nessa interface para acessar as ACEs individuais na ACL.
- Use o método IADsAccessControlList::get__NewEnum para enumerar as ACEs. O método retorna um ponteiro IUnknown. Chame QueryInterface nesse ponteiro IUnknown para obter uma interface IEnumVARIANT.
- Use o método IEnumVARIANT::Next para enumerar as ACEs na ACL. A propriedade é retornada como um VARIANT que contém um ponteiro IDispatch. Esteja ciente de que o membro vt é VT_DISPATCH. Chame QueryInterface nesse ponteiro IDispatch para obter uma interface IADsAccessControlEntry para ler a ACE.
- Chame o método IADsAccessControlEntry::get_AccessMask para obter o AccessMask e verifique se o valor AccessMask para o sinalizador ADS_RIGHT_DS_CONTROL_ACCESS. Se tiver esse sinalizador, a ACE conterá um direito de acesso de controle.
- Chame o método IADsAccessControlEntry::get_Flags para obter o sinalizador para o tipo de objeto.
- Verifique o valor de Sinalizadores para ADS_FLAG_OBJECT_TYPE_PRESENT sinalizador. Se Flags estiver definido como ADS_FLAG_OBJECT_TYPE_PRESENT, chame o método IADsAccessControlEntry::get_ObjectType para obter uma cadeia de caracteres que contenha o rightsGUID do direito de acesso de controle ao qual a ACE se aplica.
- Chame o método IADsAccessControlEntry::get_AceType para obter o tipo ACE. O tipo será uma ADS_ACETYPE_ACCESS_ALLOWED_OBJECT para conceder ao administrador o direito de acesso de controle ou ADS_ACETYPE_ACCESS_DENIED_OBJECT para negar o direito de acesso de controle.
- Chame o método IADsAccessControlEntry::get_Trustee para obter a entidade de segurança, ou seja, usuário, grupo, computador e assim por diante ao qual a ACE se aplica.
- Quando terminar com as cadeias de caracteres ObjectType e Trustee, use SysFreeString para liberar a memória para essas cadeias de caracteres.
- Quando terminar com as interfaces, chame Release para decrement ou libere todas as referências de interface.