Hoje em dia acontece muito em nossas atividades de analista e programador várias situações onde somos desafiados a gerar algum aplicativo para acessar e gerenciar algum serviço disponibilizado pelo Sistema Operacional. Há alguns meses atrás, fui desafiado a desenvolver uma solução para gerenciar os usuários da rede aqui da Universidade onde trabalho. A Universidade (Universidade Estadual de Santa Cruz) implantou um serviço de gerência de usuários conhecido como Active Directory.

O Active Directory surgiu da necessidade de se ter um único diretório, ou seja, ao invés do usuário ter uma senha para acessar o sistema principal de uma instituição, uma senha para ler seus e-mails, uma senha para se autenticar no computador, e várias outras senhas, com a utilização do Active Directory, os usuários poderão ter apenas uma única senha para acessar todos os recursos disponíveis na rede da empresa. Podemos definir um diretório como sendo um banco de dados que armazena as informações dos usuários. O Active Directory surgiu juntamente com o Windows 2000 Server e os objetos como usuários, grupos, membros dos grupos, senhas, contas de computadores, informações sobre o domínio, unidades organizacionais, etc, ficam armazenados no banco de dados do Active Directory e são acessadas a partir ferramentas administrativas.

O Windows Server possui ferramentas administrativas como o MMC (Console de Gerenciamento Microsoft) que simplificam a administração de serviços de diretório, mas não é tão amigável para o usuário comum, que no caso representam a grande maioria dos usuários que iriam criar contas no domínio da UESC.

Diante disso tínhamos o seguinte cenário:

“Implementar uma solução para que os gerentes dos setores, colegiados, departamentos pudessem criar facilmente usuários para funcionários, alunos, servidores, professores, e etc.”

A partir do cenário acima, veio a solução: Desenvolver um aplicativo WEB para que os responsáveis por departamento, setores e colegiados pudessem criar contas de usuários para acessar os recursos da rede UESC.

Diante disso foi dado o pontapé para o desenvolvimento, e nesse artigo, ou melhor, nessa série de artigos estarei apresentando como gerenciar usuários do Active Directory via .NET.

Nossa aplicação será desenvolvida em uma solução que possuirá três projetos:

  1. Um projeto do tipo Class Library – Nesse artigo estou usando uma classe já disponível na internet onde realizei algumas melhorias e adaptações para o projeto especifico;
  2. Um projeto do tipo Windows Application;
  3. Um projeto do Tipo Asp.Net Web Site.

Sendo assim, crie um novo projeto em Visual C# no Visual Studio.Net 2005 do tipo Class Library e chame de dllActiveDirectory.

Criando um projeto Class Library
Figura 1 – Criando um projeto Class Library

Altere o nome da Classe: Class1, para ActiveDirectory, e o projeto deverá possuir a seguinte estrutura conforme a imagem abaixo:

Estrutura do Solução
Figura 2 – Estrutura do Solução

O .net framework possui uma namespace conhecida como: System.DirectoryServices. Este namespace contém dois componentes principais: DirectoryEntry e DirectorySearcher. O DirectoryEntry incorpora um nó ou objeto na hierarquia do Active Directory e é utilizada para a leitura de propriedades e atributos de um objeto, além de fornecer métodos para criar, excluir, renomear e mover um objeto da Árvore de Objetos do Active Directory. O DirectorySearcher é uma classe para realizar consultas na hierarquia do Active Directory.

Agora que sabemos a finalidade da namespace DirectoryServices, vamos importa-la ao nosso projeto. Utilize a palavra reservada < using >, conforme abaixo:

Listagem 1 – Adicionando a namespace DirectoryServices

            using System;

using System.Collections.Generic;

using System.Text;

using System.DirectoryServices;

 
namespace dllActiveDirectory

{

    public class ActiveDirectory

    {

    }

        

Obs: Provavelmente você deverá adicionar uma referência a namespace System.DirectoryServices, para isso clique com o botão direito e selecione Add Reference. Vá até a namespace System.DirectoryServices e clique em OK.

Agora vamos adicionar algumas variaveis em nossa classe que serão usadas para armazenar os valores referentes a usuário, senha, caminho do dominio, nome do servidor de dominio. Para isso crie uma region e dentro dela crie as variveis. Veja a listagem abaixo:

Listagem 2 – Variáveis

            #region Variaveis


public static string ADUsuarioAdministrador;// Nome do usuario administrador do dominio

public static string ADSenhaAdministrador;//Senha do Controlador de Dominio = DC

public static string ADCaminho;// Caminho completo do servidor "LDAP://192.168.0.3";

public static string ADServidor;//Nome do servidor, exemplo: uesc.net

#endregion

        

Vamos também declarar algumas enumerações que serão usadas para definir alguns parametros dos objetos do active directory. Veja a lista abaixo:

Listagem 3 – Enumerações

            #region Enumerações

public enum ADParametrosContas

{

   UF_TEMP_DUPLICATE_ACCOUNT = 0x0100,

   UF_NORMAL_ACCOUNT = 0x0200,

   UF_INTERDOMAIN_TRUST_ACCOUNT = 0x0800,

   UF_WORKSTATION_TRUST_ACCOUNT = 0x1000,

   UF_SERVER_TRUST_ACCOUNT = 0x2000,

   UF_DONT_EXPIRE_PASSWD = 0x10000,

   UF_SCRIPT = 0x0001,

   UF_ACCOUNTDISABLE = 0x0002,

   UF_HOMEDIR_REQUIRED = 0x0008,

   UF_LOCKOUT = 0x0010,

   UF_PASSWD_NOTREQD = 0x0020,

   UF_PASSWD_CANT_CHANGE = 0x0040,

   UF_ACCOUNT_LOCKOUT = 0X0010,

   UF_ENCRYPTED_TEXT_PASSWORD_ALLOWED = 0X0080,

}

#endregion    
        

Agora que definimos as variáveis e as enumerações que serão usadas na classe, vamos começar a desenvolver os métodos de manipulação do Active Directory. Nosso primeiro método irá verificar se um determinado usuário existe no AD (Active Directory), para isso declare um método que retorne um resultado booleano a partir de um nome de usuário informado como paramêtro desse método. Veja como ficou a implementação desse método na Listagem 4.

Obs: Os detalhes da implementação dos métodos serão escritos em forma de comentários nos respectivos códigos dos métodos. Como esta classe é feita a partir de uma classe já existente, alguns métodos não foram implementados por mim, mas estarão fazendo parte da classe que utilizei no projeto.

Listagem 4 – Método que verifica se um usuário existe

            public static bool verificaUsuario(string nomeUsuario)

{
 
   //ALGUNS Métodos nessa classe já estavam implementados, visto que

   //estou fazendo adaptações nessa classe para a implementação do programa

   //especifico a esse artigo...

   //todos os métodos necessários estarão descritos nessa classe.

 

   //cria uma instância de diretório

   DirectoryEntry de = GetDirectoryObject("/" + GetLDAPDomain());

 

   //cria uma instancia da classe DirectorySearcher para realizar consultas no banco de dados do AD

   DirectorySearcher dePesquisa = new DirectorySearcher(de);

 

   //filtro de pesquisa que será pelo nome do usuario

   dePesquisa.SearchRoot = de;

   dePesquisa.Filter = "(&(objectCategory=user)(objectClass=person)(sAMAccountName=" + UserName + "))";

 

   //encontra o resultado e armazena numa collection

   SearchResultCollection resultado = dePesquisa.FindAll();

           

   //se não encontrou nada, o usuário naum existe e retorna false

   if (resultado.Count == 0)

   {

      return false;

   }

   else

   {

      return true;

   }

}

#endregion
         
        

Na segunda parte deste artigo veremos alguns outros métodos que usaremos em nossa aplicação de gerenciamento do Active Directory.