Anuncie seus apps conosco

Buscando lista de grupo do AD de acordo com nome da Rede

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




Autor: Mauricio Junior
Publicado em: 7/23/2013 12:12:08 PM
Revista ecode10 Magazine