Caro amigo leitor,
Neste mês irei abordar o assunto sobre a integração do AD(Active
Directory) com aplicações .NET. O Active Directory é uma implementação de
serviço de diretório no protocolo LDAP
(Lightweight Directory Access Protocol) que
é um protocolo de aplicação aberto, livre de fornecedor e padrão de indústria
para acessar e manter serviços de informação de diretório distribuído sobre uma
rede de Protocolo da Internet (IP). (Fonte: https://pt.wikipedia.org/wiki/LDAP)
O Active Directory armazena informações sobre objetos em rede de
computadores, usuários, grupos, senhas, contas de computadores, unidades
organizacionais. Uma das necessidades de sua criação foi a unificação de
usuário para acessar diferentes recursos como: sistemas, e-mails, logar no
computador. Em poucas palavras, o mesmo se comporta como um grande Banco de
Dados destas informações.
É importante
salientar que o Active Directory está presente nos Sistemas Operacionais da
Microsoft desde sua versão 2000, lembrando que para instalá-lo e utilizá-lo
deveremos ter uma licença do mesmo.
A plataforma .NET fornece algumas bibliotecas nativas para trabalhar com
o AD oferecendo uma total compatibilidade com o mesmo, facilitando a vida de
nós programadores. Neste artigo criarei um exemplo utilizando Formulários
Windows (Windows Forms) junto com o Microsoft Visual Studio Community 2017 com
a liguagem C#. Usarei também o Windows Server 2012 R2. Demonstrarei todos os
passos para criar um usuário contendo todas as propriedades necessárias dentro
de uma Unidade Organizacional (As famosas OUs)
Criando um novo projeto
Inicie um novo projeto clicando em “Arquivo/Novo/Projeto...” escolhendo
a opção “Aplicativo do Windows Forms”. Defina um nome e local de sua
preferência clicando no botão “Ok” para finalizar. O nosso formulário deverá
conter três campos do tipo “TextBox” para inserção (Id, Nome, Sobrenome), um
campo do tipo “Combobox” (Listar as Unidades Organizacionais - OU), um “Button“
denominado “Cadastrar” para execução dos comandos e um “ListBox” para
demonstrar os cadastros efetuados. Para maiores detalhes confira a Imagem 01.
![]() |
Figura 01: Formulário de Integração. |
Criando uma
OU (Unidade Organizacional)
Acesse o Windows Server e na “Central Administrativa do Active
Directory” clique na região esquerda do domínio desejado e com o botão direito
escolha “Novo/Unidade Organizacional”. No nosso caso foi inserido “TESTE_C”.
Lembrando que nossos usuários ficarão armazenados dentro desta propriedade. Ver
imagem 02.
![]() |
Figura 02: Criando a Unidade Organizacional. |
Codificando o
Exemplo
Partiremos para a codificação do projeto, o primeiro passo seria adicionar
a biblioteca específica para esta tarefa, a “System.DirectoryServices” logo em seguida criaremos alguns métodos para
trabalhar, exemplo: AdicionarUsuario(), ListarTodosUsuarios() e ListarOus().
using System.Windows.Forms;
using System.DirectoryServices;
namespace WindowsFormsApp1
{
public partial class FrmImport : Form
{
public const string nomeDominio = "LDAP://theclub.avare.edu";
Criaremos
uma constante com o nome do domínio,contendo a estrutura de exemplo acima.
public FrmImport()
{
InitializeComponent();
}
O
método construtor “FrmImport()” é padrão em todos os formulários Windows.
private void FrmImport_Load(object sender, EventArgs e)
{
ListarOus();
}
No
evento “Load()” iremos alimentar a combobox contendo as Unidades
Organizacionais de nosso domínio. Por isto invoque o método “ListarOus” que
comentaremos logo abaixo.
private void ListarOus()
{
cbOus.Items.Clear();
DirectoryEntry diretorio = new DirectoryEntry(nomeDominio);
DirectorySearcher
pesquisa = new
DirectorySearcher(diretorio);
pesquisa.Filter
= "(objectCategory=organizationalUnit)";
foreach (SearchResult res in pesquisa.FindAll())
{
string ou = res.Path;
int tamOu = ou.IndexOf(",DC") - ou.IndexOf("OU=");
string ouNew = ou.Substring(ou.IndexOf("OU="), tamOu);
cbOus.Items.Add(ouNew);
}
}
Primeiramente
limparemos o componente Combobox através do método “Clear()”. Deveremos
instanciar três objetos, sendo o “DirectoryEntry” contendo o caminho do domínio
(constante nomeDominio), “DirectorySearcher” responsável pela pesquisa dentro
do domínio e o método “Filter” para filtrarmos todos os objetos da categoria
“organizationalUnit”. Faremos um Foreach para localizarmos apenas a substring
contendo o nome das “Ous” cadastradas no Windows Server.
private bool
AdicionarUsuario(string accountName, string givenName, string surName, string displayName)
{
DirectoryEntry obDominio = null;
try
{
obDominio
= new
DirectoryEntry(nomeDominio);
DirectoryEntries
entrada = obDominio.Children;
DirectoryEntry dados = entrada.Add("CN="+displayName+","+ cbOus.Text, "User");
dados.Properties["samAccountName"].Add(accountName); dados.Properties["givenName"].Add(givenName);
dados.Properties["sn"].Add(surName);
dados.Properties["displayName"].Add(displayName);
dados.CommitChanges();
return true;
}
catch
{
return false;
}
}
O
método booleano “AdicionarUsuario” irá possuir alguns parâmetros de entrada
como: accountName para incluir o ID,
givenName para o campo Nome, surName para o SobreNome e displayName para o Nome Completo. É bom lembrarmos que estas propriedades são
chaves específicas da estrutura do AD. Dentro de um “Try/Catch” faremos
todo o trabalho de inclusão, instanciando os objetos “DirectoryEntry” e
“DirectoryEntries”. Para incluir os dados contidos nos parâmetros criaremos um
objeto do tipo “DirectoryEntry” e através do método “Add” podemos concluir esta
tarefa. Para finalizar execute o “CommitChanges()”.
private void
ListarTodosUsuarios()
{
lstUsuarios.Items.Clear();
DirectoryEntry diretorio = new DirectoryEntry(nomeDominio);
DirectorySearcher
pesquisa = new
DirectorySearcher(diretorio, cbOus.Text);
SearchResult resultado =
pesquisa.FindOne();
if (resultado != null)
{
DirectoryEntry entrada =
resultado.GetDirectoryEntry();
foreach (DirectoryEntry dir in entrada.Children)
{
string usuario = dir.Name;
lstUsuarios.Items.Add(usuario);
}
}
}
Já
o método “ListarTodosUsuarios()” terá a tarefa de demonstrar os usuários
cadastrados na determinada “OU”. Faremos a instância do objeto
“DirectoryEntry”, “DirectorySearcher” e “SearcherResult”. Iremos adicionar os
usuários no “ListBox” através de um “Foreach” com o auxílio da propriedade
“dir.Name”.
private void
btnCadastrar_Click(object sender,
EventArgs e)
{
lstUsuarios.Items.Clear();
if (txtId.Text.Length <= 0)
{
MessageBox.Show("Para proceder é necessário informar o Id do usuário!", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Warning);
txtId.Focus();
return;
}
if (txtNome.Text.Length <= 0)
{
MessageBox.Show("Para proceder é necessário informar o Nome do usuário!", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Warning);
txtNome.Focus();
return;
}
if (txtSobrenome.Text.Length <= 0)
{
MessageBox.Show("Para proceder é necessário informar o Sobrenome do usuário!", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Warning);
txtSobrenome.Focus();
return;
}
if (cbOus.SelectedIndex < 0)
{
MessageBox.Show("Para proceder é necessário selecionar uma OU!", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Warning);
cbOus.Focus();
return;
}
if (AdicionarUsuario(txtId.Text, txtNome.Text, txtSobrenome.Text,
txtNome.Text + " " + txtSobrenome.Text) == false)
MessageBox.Show("Erro no Cadastro!", "Atenção", MessageBoxButtons.OK,
MessageBoxIcon.Information);
ListarTodosUsuarios();
}
}
No evento “Click” do “Button” realizaremos algumas consistências nos
campos Id, Nome, Sobrenome e Ou. Testaremos se os mesmos não estão vazios.
Invocaremos o método supracitado “AdicionarUsuario” informando todos os
parâmetros necessários, resultando em um valor booleano. Caso ocorra algum erro
informaremos ao usuário através de um “MessageBox”. Finalizaremos com o método
“ListarTodosUsuarios()”
Podemos conferir o projeto em run-time na Imagem 03.
![]() |
Figura 03: Exemplo em run-time. |
No Windows Server teremos o registro inserido com sucesso. Ver Figura
04.
![]() |
Figura 04: Usuário criado no AD. |
Conclusões
O uso do Active Directory do Windows Server é muito comum nas empresas
que possuem controle de usuários, pela sua facilidade e qualidade em se
tratando deste tipo de serviço. A plataforma .NET fornece uma total compatibilidade
com o mesmo, disponibilizando bibliotecas nativas, como por exemplo a System.DirectoryServices.
Com o uso desta biblioteca foi
criada um pequena aplicação para cadastro de usuários no AD, informando alguns
campos mais comuns para um fácil aprendizado.
Fica a dica, um abraço e até
o mês que vem!
Sobre o autor
Thiago
Cavalheiro Montebugnoli adora aprender novas tecnologias. Formado pela
Faculdade de Tecnologia de Botucatu – SP (FATEC), já desenvolveu softwares
utilizando a plataforma .NET, Delphi junto com Banco de Dados SQL Server e
Firebird. Como experiências profissionais mais recentes, possui em seu
currículo sua atuação no Centro de Processamento de Dados da Prefeitura
Municipal de Itaí-SP e atualmente compõe a equipe da Coordenadoria Tecnologia
da Informação no IFSP – Instituto Federal do Estado de São Paulo em Avaré. Além
disso, é colunista mensal da Revista The Club Megazine e é consultor Técnico do
The Club. Possui as
seguintes certificações: MCP - Microsoft Certified Professional, MCTS -
Microsoft Certified Technology Specialist, MCAD - Microsoft Certified
Application Developer e MCSD - Microsoft
Certified Solution Developer.