Definir direitos de acesso em um objeto

Ao usar os objetos ADSI COM IADsSecurityDescriptor (descritor de segurança), IADsAccessControlList (DACLs e SACLs) e IADsAccessControlEntry (ACE) para adicionar uma ACE a uma ACL, você está fazendo alterações na propriedade nTSecurityDescriptor do objeto especificado no cache de propriedades. Isso significa que os métodos put nos objetos que contêm a nova ACE e o método IADs.SetInfo devem ser chamados para gravar o descritor de segurança atualizado no diretório a partir do cache de propriedades.

Para obter mais informações e um exemplo de código que define uma ACE em um objeto nos Serviços de Domínio Active Directory, consulte Código de exemplo para definir uma ACE em um objeto de diretório.

Use o processo geral a seguir para criar uma ACE para um direito de acesso e definir essa ACE na DACL de um objeto.

  1. Obtenha um ponteiro de interface de IADs para o objeto.

  2. 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 contendo um ponteiro IDispatch (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.

  3. Use a propriedade IADsSecurityDescriptor.DiscretionaryAcl para obter a DACL. 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.

  4. Use CoCreateInstance para criar o objeto ADSI COM para a nova ACE e obter um ponteiro de interface IADsAccessControlEntry para esse objeto. Lembre-se de que o ID da classe é CLSID_AccessControlEntry.

  5. Defina as propriedades da ACE usando os métodos IADsAccessControlEntry:

    1. Use IADsAccessControlEntry::p ut_Trustee para definir o administrador ao qual esta ACE se aplica. O administrador é um usuário, grupo ou outra entidade de segurança. Seu aplicativo deve usar o valor da propriedade apropriada do objeto de usuário ou grupo do administrador ao qual você deseja aplicar a ACE. O administrador é especificado como um BSTR e pode assumir as seguintes formas:
      • Conta de domínio (o nome de logon usado em uma versão anterior do Windows NT) do formato "domínio\<conta de usuário" onde "domínio" é o nome do domínio>> do Windows NT que contém o usuário e "conta>> de usuário"<<< é a propriedade sAMAccountName do usuário especificado. Por exemplo: "fabrikam\jeffsmith".
      • Entidade de segurança bem conhecida que representa identidades especiais definidas pelo sistema de segurança do Windows NT, como todos, sistema local, principal self, usuário autenticado, proprietário do criador e assim por diante. Os objetos que representam as entidades de segurança conhecidas são armazenados no contêiner Entidades de Segurança Conhecidas abaixo do contêiner Configuração. Por exemplo, logon anônimo.
      • Grupo interno que representa os grupos de usuários internos definidos pelo sistema de segurança do Windows NT. Ele tem o formato "BUILTIN\<group name" onde "group name>>"< é o nome do grupo de usuários interno. Os objetos que representam os grupos internos são armazenados no contêiner Interno abaixo do contêiner de domínio. Por exemplo, "BUILTIN\Administrators".
      • SID (formato de cadeia de caracteres) do usuário especificado, que é a propriedade objectSID do usuário especificado. Você pode converter em forma de cadeia de caracteres usando a função ConvertSidToStringSid na API de segurança do Win32. Por exemplo: "S-1-5-32-548".
    2. Use a propriedade IADsAccessControlEntry.AccessMask para definir a máscara que especifica o direito de acesso. A enumeração ADS_RIGHTS_ENUM especifica os direitos de acesso que você pode definir em um objeto de diretório.
    3. Use a propriedade IADsAccessControlEntry.AceType para especificar se os direitos de acesso definidos por AccessMask devem ser permitidos ou negados. Para direitos padrão, isso pode ser ADS_ACETYPE_ACCESS_ALLOWED ou ADS_ACETYPE_ACCESS_DENIED. Para direitos específicos de objeto (direitos que se aplicam a uma parte específica de um objeto ou a um tipo específico de objeto), use ADS_ACETYPE_ACCESS_ALLOWED_OBJECT ou ADS_ACETYPE_ACCESS_DENIED_OBJECT. A enumeração ADS_ACETYPE_ENUM especifica os tipos de acesso que você pode definir em uma ACE.
    4. Use a propriedade IADsAccessControlEntry.AceFlags para especificar se outros contêineres ou objetos abaixo do objeto especificado podem herdar a ACE. A enumeração ADS_ACEFLAG_ENUM especifica os sinalizadores de herança que você pode definir em uma ACE.
    5. Use a propriedade IADsAccessControlEntry.Flags para especificar se o direito se aplica a uma parte específica do objeto, a um tipo de objeto herdado ou a ambos.
    6. Se Sinalizadores estiver definido como ADS_FLAG_OBJECT_TYPE_PRESENT, defina a propriedade IADsAccessControlEntry.ObjectType o especifique uma cadeia de caracteres que contenha o GUID da classe de objeto (para ADS_RIGHT_DS_CREATE_CHILD ou ADS_RIGHT_DS_DELETE_CHILD), propriedade, conjunto de propriedades, gravação validada ou direito estendido ao qual a ACE se aplica. O GUID deve ser especificado como uma cadeia de caracteres do formulário produzido pela função StringFromGUID2 na biblioteca COM.
    7. Se Flags estiver definido como ADS_FLAG_INHERITED_OBJECT_TYPE_PRESENT, defina a propriedade IADsAccessControlEntry.InheritedObjectType para especificar uma cadeia de caracteres que contenha o GUID da classe de objeto herdada à qual a ACE se aplica. O GUID deve ser especificado como uma cadeia de caracteres do formulário produzido pela função StringFromGUID2 na biblioteca COM.
  6. Use o método QueryInterface no objeto IADsAccessControlEntry para obter um ponteiro IDispatch. O método IADsAccessControlList.AddAce requer um ponteiro de interface IDispatch para a ACE.

  7. Use IADsAccessControlList.AddAce para adicionar a nova ACE à DACL. Lembre-se de que a ordem das ACEs dentro da ACL pode afetar a avaliação do acesso ao objeto. O acesso correto ao objeto pode exigir que você crie uma nova ACL, adicione as ACEs da ACL existente na ordem correta à nova ACL e, em seguida, substitua a ACL existente no descritor de segurança pela nova ACL. Para obter mais informações, consulte Ordem de ACEs em uma DACL.

  8. Use a propriedade IADsSecurityDescriptor.DiscretionaryAcl para gravar a DACL que contém a nova ACE no descritor de segurança. Para obter mais informações sobre DACLs, consulte DACLs nulas e DACLs vazias.

  9. Use o método IADs.Put para gravar o descritor de segurança na propriedade nTSecurityDescriptor do objeto no cache de propriedades.

  10. Use o método IADs.SetInfo para atualizar a propriedade no objeto no diretório.