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();
try
{
using (DirectorySearcher searcher = new DirectorySearcher(root, string.Format("(sAMAccountName={0})", sam)))
{
&-family:Consolas;">
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.
This article was originally written by:
Maurício Júnior
MCP, MCAD, MVP Microsoft
www.mauriciojunior.org
blog.mauriciojunior.org