Enumerando grupos em um domínio
Os grupos podem ser colocados em qualquer contêiner ou unidade organizacional (UO) em um domínio, bem como na raiz do domínio. Isso significa que os grupos podem estar em vários locais na hierarquia de diretórios. Portanto, você tem duas opções para enumerar grupos:
Enumere os grupos contidos diretamente em um contêiner, UO ou na raiz do domínio.
Vincule explicitamente ao objeto de contêiner que contém os grupos a serem enumerados, defina um filtro que contenha "groups" como a classe usando a propriedade IADsContainer.Filter e use o método IADsContainer::get__NewEnum para enumerar os objetos de grupo.
Essa técnica enumera grupos contidos diretamente em um contêiner ou objeto de UO. Se o contêiner contiver outros contêineres que possam potencialmente conter outros grupos, você deverá vincular a esses contêineres e enumerar recursivamente os grupos nesses contêineres. Para manipular os objetos de grupo e ler somente propriedades específicas, use a pesquisa profunda descrita na Opção 2.
Como a enumeração retorna ponteiros para objetos ADSI COM que representam cada objeto de grupo, você pode chamar QueryInterface para obter ponteiros de interface IADs, IADsGroup e IADsPropertyList para o objeto de grupo, ou seja, você pode obter ponteiros de interface para cada objeto de grupo enumerado em um contêiner sem precisar vincular explicitamente a cada objeto de grupo. Para executar operações em todos os grupos diretamente em um contêiner, a enumeração não requer vinculação a cada grupo para chamar IADs ou IADsGroup métodos. Para recuperar propriedades específicas de grupos, use IDirectorySearch conforme descrito na segunda opção.
Uma exceção a isso ocorre quando você tenta enumerar um grupo que contém membros que são entidades de segurança bem conhecidas, como Todos, Usuários autenticados, BATCH e assim por diante. Como você não pode vincular a esses tipos de objetos, eles não são listados quando você enumera grupos no escopo do WinNT, mesmo que ele possa parecer vincular, porque determinados métodos IADs, como Class, ADsPath e Name retornam resultados corretos quando invocados em membros enumerados.
Execute uma pesquisa profunda por "objectCategory=group" para localizar todos os grupos em uma árvore.
Primeiro, vincule-se ao objeto de contêiner onde começar a pesquisa. Por exemplo, para localizar todos os grupos em um domínio, vincule-se à raiz do domínio; para localizar todos os grupos na floresta, vincule-se ao catálogo global e pesquise a partir da raiz do GC.
Em seguida, use IDirectorySearch para consultar usando um filtro de pesquisa que contém (objectCategory=group) e preferência de pesquisa de ADS_SCOPE_SUBTREE.
Observação
Você pode executar uma pesquisa com uma preferência de pesquisa de ADS_SCOPE_ONELEVEL para limitar a pesquisa ao conteúdo direto do objeto de contêiner ao qual você vinculou.
IDirectorySearch recupera apenas os valores de propriedades específicas de grupos. Para recuperar valores, use IDirectorySearch. Para manipular os objetos de grupo retornados de uma pesquisa, ou seja, usar IADs ou métodos IADsGroup, vincule-os explicitamente. Para fazer isso, especifique distinguishedName como uma das propriedades a serem retornadas da pesquisa e use os nomes distintos retornados para vincular a cada grupo retornado na pesquisa.
Somente propriedades específicas são recuperadas. Não é possível recuperar todos os atributos sem especificar explicitamente todos os atributos possíveis da classe de grupo.