Olá leitor(a), hoje eu vou falar um pouco sobre como desenvolver no seu aplicativo Web a busca todos os grupos da rede para um determinado usuário. Esse código funciona também no Windows Forms.

Vou tentar explicar o meu exemplo antes de mostrar o código, não irei me alongar muito no artigo. O meu sistema Web tem um banco de dados com usuários e grupos, eu preciso comparar esses usuários aos grupos pertecentes no Active Directory (AD), se houver algum grupo igual no banco de dados então o usuário entra no sistema, ou seja, ele utiliza o mesmo usuário logado no Windows. Pra isso, seu Windows deve estar em uma rede coorporativa; isto é; com o Active Directory ativado em um servidor da rede.

Esse código que vou mostrar busca a lista de grupos daquele usuário logado e compara com o banco de dados pegando a lista de grupos. O objetivo aqui não é mostrar a conexão com o banco de dados ou select, quero mostrar as poucas linhas para consultar no AD (Active Directory).

Utilizado: Visual Studio, linguagem C#, tipo do projeto Web.

O primeiro passo é importar duas dlls na própria ferramenta da Microsoft. Para isso, clique com o botão direito do mouse em cima da basta References, depois escolha a opção Add References. Busque então por: 
System.DirectoryServices
System.DirectoryServices.AccountManagement.


Figura 1 – Buscando as dlls

Depois de importar as dlls, vamos colocar a mão na massa.

Como no load da página o programa já pega os dados da rede, vamos precisar criar dois métodos separados e um principal que chama eles passando os parâmetros. Lembre-se que para pegar os dados da rede, é necessário ter pelo menos o nome da rede no arquivo de configuração ou no código fixo.

Listagem 1 – Pegando o nome da rede e atribuindo os valores na variável dominio.

DirectoryEntry dominio = new DirectoryEntry("LDAP://" + System.Configuration.ConfigurationManager.AppSettings["NomeRede"].ToString());


Listagem 2 – Buscando a lista de grupo na rede passando o nome do usuário e a variável dominio.

List<string> _listaDeGrupoDoUsuario = BuscaListadeGrupo(BuscaUsuarioDominio(txtUsuario.Text, dominio));



Listagem 3 – Buscando a lista de membros

public List<string> BuscaListadeGrupo(DirectoryEntry de)

        {

            List<string> memberof = new List<string>();

 

            foreach (object oMember in de.Properties["memberOf"])

            {

                memberof.Add(oMember.ToString());

            }

 

            return memberof;

        }


Com a variável preenchida na listagem 4, para buscar a lista de grupos no AD fica fácil. Busca pegar uma lista da propriedade memberOf, adicionar a uma variável do tipo list e retornar.

Listagem 4 – Busca o objeto no AD.

        public DirectoryEntry BuscaUsuarioDominio(string sam, DirectoryEntry root)

        {

            try

            {

                using (DirectorySearcher searcher = new DirectorySearcher(root, string.Format("(sAMAccountName={0})", sam)))

                {

                    SearchResult sr = searcher.FindOne();

 

                    if (!(sr == null)) return sr.GetDirectoryEntry();

                    else

                        return null;

                }

            }

            catch (Exception ex)

            {

                throw ex;

            }

           

        }


        Esse método (listagem 3) recebe o nome do usuário e a variável domínio. O código verificar se existe o domínio informado e o nome da pessoa. Se o código encontrar pelo menos um, então a variável é preenchida e retornada ao método anterior, mostrado na listagem 3.

Depois de retornar os dados, você pode procurar um determinado grupo ou todos, como achar melhor. A lista de grupos do usuário pode ser buscada com uma lista de comando. Veja a listagem 5.

Listagem 5 – Buscando um determinado grupo

var _grupoEncontrado = _listaDeGrupoDoUsuario.AsParallel().Where

                            (s => s.Contains("Internet")).ToList();

Esse código verifica se a lista existe algum grupo parecido com o nome “Internet”. O resultado é retornado na variável “_grupoEncontrado”. Caso queira buscar alguns grupos, faça um for e busque usando esse comando, linha por linha.

Peço desculpas porque não poderei colocar aqui o resultado encontrado, mas garanto para você que se fizer igualzinho o que fiz vai funcionar perfeitamente. Segue todo o código na listagem 6 mostrando todo o código.

Listagem 6 – Todo o código

Private void Load(){

DirectoryEntry dominio = new DirectoryEntry("LDAP://" + System.Configuration.ConfigurationManager.AppSettings["NomeRede"].ToString());

 

List<string> _listaDeGrupoDoUsuario = BuscaListadeGrupo(BuscaUsuarioDominio(txtUsuario.Text, dominio));

}

 

public List<string> BuscaListadeGrupo(DirectoryEntry de)

{

List<string> memberof = new List<string>();

 

       foreach (object oMember in de.Properties["memberOf"])

       {

             memberof.Add(oMember.ToString());

}

 

     return memberof;

}

 

public DirectoryEntry BuscaUsuarioDominio(string sam, DirectoryEntry root)

{

try

       {

             using (DirectorySearcher searcher = new DirectorySearcher(root, string.Format("(sAMAccountName={0})", sam)))

{

       SearchResult sr = searcher.FindOne();

 

if (!(sr == null)) return sr.GetDirectoryEntry();

              else

                    return null;

}

}

catch (Exception ex)

{

             throw ex;

}    

}

 


Espero que te ajude e resolva o seu problema. Qualquer dúvida pode entrar em contato pelo site www.mauriciojunior.org