quarta-feira, 16 de outubro de 2019

Linguagem C# - Integração com o Active Directory do Windows Server


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.

Nenhum comentário:

Postar um comentário