Active Directory com C#

Uma das coisas mais fascinantes do framework .NET é a sua integração com alguns serviços do Windows. Trataremos de um deles nesse post de inauguração: o Active Directory.

O serviço de domínio da Microsoft, carinhosamente chamado de AD, possui ferramentas poderosas para o gerenciamento de diretórios, sejam eles pequenos ou corporativos. A arquitetura do AD abrange LDAP (Lightweight Directory Access Protocol, ou Protocolo Leve de Acesso a Diretório), autenticação Kerberos (usada para autenticação nas máquinas) e alguns serviços de DNS. Com ele, é possível gerenciar políticas de rede de maneira avançada. Mas o foco do post não é falar sobre o AD em si, e sim como usar o C# para tirar proveito dessa mecânica.

Em primeiro lugar, vamos criar um método para listar todos os domínios da árvore em que o computador está logado. Lembrando que devemos estar conectados ao diretório do AD para podermos realizar pesquisas.

O código do método pode ser algo do tipo:

public static List<Domain> EnumerateDomains()
{

List<Domain> lDomain = new List<Domain>();

Forest forLocalForest = Forest.GetCurrentForest();

DomainCollection dcDomains = forLocalForest.Domains;

foreach (Domain objDomain in dcDomains)
{
lDomain.Add(objDomain);
}

return lDomain;

}

OK, nada demais até aí. Estamos criando uma lista de domínios, requisitando a floresta atual e pegando os domínios desta floresta, depois devolvemos tudo na lista. Mas nós não temos nada de útil por enquanto. Podemos pegar informações mais relevantes. Esse código de console nos devolveria algumas informações úteis sobre o domínio atual que nossa máquina está conectada.

O primeiro passo é a se fazer é aumentar o buffer do console, pois em um domínio vão existir muitos usuários e às vezes não será possível imprimir tudo na tela sem aumentar o espaço.

Console.BufferHeight = Int16.MaxValue – 1;

Em seguida, vamos enumerar os domínios:

try
{
Console.WriteLine(”Enumerando domínios . . .\n”);

foreach (Domain d in EnumerateDomains())

{
Console.WriteLine(string.Format(”Nome do domínio:{0}”, d.Name));
}
}

Isso mostrará o nome de todos os domínios disponíveis na rede.

Vamos agora imprimir algumas informações sobre o DC (Domain Controller, ou Controlador de Domínio):

Console.WriteLine(” * Algumas informações sobre os controladores de domínio…”);

foreach (DomainController dc in d.DomainControllers)
{
Console.WriteLine(string.Format(”\n\tNome do DC: {0}\n\tSistema Operacional do DC: {1}\n\tIP do DC: {2}\n\tHora e data atual do DC: {3}”, dc.Name, dc.OSVersion, dc.IPAddress, dc.CurrentTime.ToString(”dd/MM/yyyy HH:mm:ss”)));
Console.WriteLine(”\n * Algumas informações sobre as roles do DC…\n”);

foreach (ActiveDirectoryRole adr in dc.Roles)
{
Console.WriteLine(”\t” + adr.ToString());
}
}

Esse código irá mostrar o nome, o sistema operacional, o IP e a hora e data atual do DC. Logo em seguida, irá mostrar as roles do DC.

No final, iremos mostrar todos os usuários criados nesse DC. O código é assim:

Console.WriteLine(”\n * Enumerando usuários do DC…”);
DirectoryEntry group = new DirectoryEntry(”LDAP://” + dc.IPAddress);
DirectorySearcher src = new DirectorySearcher(group, “(objectCategory=user)”);

foreach (SearchResult res in src.FindAll())
{
Console.WriteLine(”\t” + res.Properties["name"][0]);
}

Pronto, agora nós já temos alguma informação relevante sobre o DC. O código completo do projeto segue abaixo:

using System;
using System.Collections.Generic;
using System.Text;
using System.DirectoryServices;
using System.DirectoryServices.ActiveDirectory;

namespace AD_Test
{
class Program
{

static void Main(string[] args)
{
Console.BufferHeight = Int16.MaxValue – 1;
try
{
Console.WriteLine(”Enumerando domínios . . .\n”);

foreach (Domain d in EnumerateDomains())
{
Console.WriteLine(string.Format(”Nome do domínio:{0}”, d.Name));
Console.WriteLine(” * Algumas informações sobre os controladores de domínio…”);

foreach (DomainController dc in d.DomainControllers)
{
Console.WriteLine(string.Format(”\n\tNome do DC: {0}\n\tSistema Operacional do DC: {1}\n\tIP do DC: {2}\n\tHora e data atual do DC: {3}”, dc.Name, dc.OSVersion, dc.IPAddress, dc.CurrentTime.ToString(”dd/MM/yyyy HH:mm:ss”)));
Console.WriteLine(”\n * Algumas informações sobre as roles do DC…\n”);

foreach (ActiveDirectoryRole adr in dc.Roles)
{
Console.WriteLine(”\t” + adr.ToString());
}

Console.WriteLine(”\n * Enumerando usuários do DC…”);
DirectoryEntry group = new DirectoryEntry(”LDAP://” + dc.IPAddress);
DirectorySearcher src = new DirectorySearcher(group, “(objectCategory=user)”);

foreach (SearchResult res in src.FindAll())
{
Console.WriteLine(”\t” + res.Properties["name"][0]);
}
}
}
}
catch (Exception ex)
{
Console.WriteLine(string.Format(”Erro ao tentar enumerar domínios: {0}”, ex.Message));
}

Console.WriteLine(”\nEnumeração concluída”);
Console.Read();

}

public static List<Domain> EnumerateDomains()
{
List<Domain> lDomain = new List<Domain>();
Forest forLocalForest = Forest.GetCurrentForest();
DomainCollection dcDomains = forLocalForest.Domains;

foreach (Domain objDomain in dcDomains)
{
lDomain.Add(objDomain);
}

return lDomain;
}
}
}

Espero que tenham gostado. Até a próxima, e cuidado para não quebrar seu servidor de domínio, alguém pode ficar com raiva.

Tags: ,

Deixar um comentário