Continuando a nossa seqüência de artigos para desenvolver uma solução em .Net de gerenciamento de usuários do Active Directory, vamos implementar mais alguns métodos em nossa classe. Na parte 1, definimos a estrutura do nosso projeto e criamos nossa ClassLibrary que chamamos de: dllActiveDirectory. Terminamos o artigo implementando o método VerificaUsuario.
Vamos agora implementar quatro métodos:
· CriarUsuario
· AlterarSenha
· HabilitaUsuario
· DesabilitaUsuario
Obs: Conforme já citado na primeira parte desse artigo, a classe a ser implementada nesse projeto é baseada em uma classe já existente.
O primeiro método a ser criado será o método HabilitaUsuario que é responsável por ativar a conta de usuário no AD. Em seguida será implementado também o método DesabilitaUsuario.Veja o código dos métodos na listagem abaixo.
//método habilita usuário
public static void HabilitaUsuario(DirectoryEntry de)
{
object ent = de.NativeObject;
Type type = ent.GetType();
type.InvokeMember("AccountDisabled", BindingFlags.SetProperty, null, ent, new object[] { false });
de.CommitChanges();
de.Close();
de.Dispose();
}
//método que desabilita um usuário
public static void DesabilitaUsuario(DirectoryEntry de)
{
de.Properties["userAccountControl"][0] = ADParametrosContas.UF_NORMAL_ACCOUNT | ADParametrosContas.UF_DONT_EXPIRE_PASSWD | ADParametrosContas.UF_ACCOUNTDISABLE;
de.CommitChanges();
de.Close();
}
Listagem 1 – Métodos Habilita e Desabilita Usuários
Dando continuidade a implementação dos métodos, vamos implementar agora o método AlterarSenha, que invoca o método SetPassword para alterar a senha de um usuário. Veja na listagem 2 a codificação deste método.
public static void AlterarSenha(DirectoryEntry de, string Senha)
{
//invoca o método SetPassword para troca a senha do usuário
de.Invoke("SetPassword", new Object[] { Senha });
}
Listagem 2 – Método Alterar Senha
Por último, é hora de codificar o método CriarUsuario , que utilizará os métodos criados anteriormente. Na listagem 3 temos a implementação desse método.
//MÉTODO PARA CRIAR UM NOVO USUÁRIO NO ACTIVE DIRECTORY
public static DirectoryEntry CriarUsuario(string cn, string senha, string caminho, string nome)
{
string LDAPDomain = "/" + caminho + "," + GetLDAPDomain();
//cria uma instância de diretório
DirectoryEntry de= GetDirectoryObject(LDAPDomain);
DirectoryEntry usuario = de.Children.Add("CN=" + nome, "user");
//PROPRIEDADES DO USUÁRIO
usuario.Properties["name"].Value = nome;
usuario.Properties["sAMAccountName"].Value = cn;
usuario.Properties["displayname"].Value = nome;
usuario.Properties["userPrincipalName"].Value = cn;
usuario.CommitChanges();
//MÉTODO QUE ALTERAR A SENHA DO USUÁRIO
AlterarSenha(usuario, senha);
//COMMIT CHANGES EXECUTA E REALIZA AS INSERÇÕES/ALTERAÇÕES NA BASE DO AD
usuario.CommitChanges();
//Informa que o login será alterado na primeira vez que o usuário fizer o login no AD
usuario.Properties["userAccountControl"].Value = AdsUserFlags.PasswordExpired;
usuario.Properties["pwdLastSet"].Value = 0;
usuario.CommitChanges();
//CHAMA O MÉTODO PARA HABILITAR A CONTA DO USUÁRIO
HabilitaUsuario(usuario);
usuario.CommitChanges();
de.Close();
de.Dispose();
return usuario;
}
Listagem 3 – Método Criar Usuário
Até o momento nossa classe já possui os métodos: VerificaUsuario,Habilita e Desabilita Usuário, AlterarSenha e CriarUsuário. Com esses métodos já é possível começar a Desenvolver a interface para gerenciar os usuários. Primeiramente vamos desenvolver nosso aplicativo Windows Forms proposto na parte 1. O aplicativo Windows Forms será responsável pela configuração da árvore de diretórios do Active Directory, na qual a estrutura das unidades organizacionais estarão armazenadas em um banco de dados no SQL Server.
Diante do cenário da aplicação que se baseia esse artigo:
“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.”
Foi necessário desenvolver um pequeno aplicativo Windows Forms que seria responsável por catalogar a árvore de diretórios do Active Directory em um banco de dados. Dessa forma quando era necessário cadastrar um usuário no sistema em um determinado caminho da árvore, o sistema iria buscar na base de dados qual o caminho completo de uma unidade organizacional.
Para deixar mais compreensível como funciona uma arvore de diretório no AD, veja a imagem abaixo:
Figura 1 – Árvore de Diretórios do Active Directory
Através do Console acima, podemos verificar a estrutura de uma implementação do Active Directory. Do lado esquerdo temos as unidades organizacionais (OU) e do lado direito temos os usuários cadastrados. Os usuários marcados com um ícone VERMELHO com um X em branco estão com as contas inativas.
A partir da árvore de diretório acima, a idéia é desenvolver uma base de dados de forma a armazenar toda a estrutura dessa árvore de diretório. Para isso estarei usando o Microsoft SQL Server 2005 Express. Antes de desenvolver a base de dados, irei explicar como funciona a estrutura do AD para esse projeto:
Os usuários serão cadastrados nas unidades organizacionais:
· Alunos
· Professores
· Convidado
Os alunos estão alocados em um COLEGIADO, que pertence a um DEPARTAMENTO. Veja exemplo da estrutura de um ALUNO:
UESC -> DCAA -> COLEGIADO AGRONOMIA -> ALUNOS
Os professores e convidados estão alocados em um DEPARTAMENTO. Veja exemplo da estrutura de um PROFESSOR e VISITANTE:
UESC -> DCAA -> PROFESSORES
UESC -> DCAA -> CONVIDADO
Sendo assim, podemos concluir que a Árvore de Diretórios funciona de forma HIERÁRQUICA, com uma Unidade Organizacional que pertence a uma outra Unidade Organizacional, e uma Unidade Raiz na quais as demais unidades serão criadas.
Após compreender a estrutura do AD, é hora de implementar nosso banco de dados. Dessa forma, crie uma nova base de dados no SQL SERVER (DataBase -> New DataBase).
Nossa base de dados possuirá as seguintes tabelas:
· Curso: contém o nome do Curso e uma Senha Padrão para que todos os usuários(alunos) pertencentes a um Curso tenha uma senha inicial padrão, que será alterada após o primeiro Login;
· Departamento: contém o nome do Departamento e uma Senha Padrão para que todos os usuários(professores e convidados) pertencentes a um Departamento tenha uma senha inicial padrão, que será alterada após o primeiro Login;
· Unidade: contém o nome da Unidade Organizacional;
· CursoUnidade: contém o ID do curso, o ID da Unidade, o ID da unidade Pai, e o ID do Nó;
· DepartamentoUnidade: contém o ID do departamento, o ID da Unidade, o ID da unidade Pai, e o ID do Nó.
As tabelas CursoUnidade e DepartamentoUnidade foram criadas para armazenar a hierarquia da árvore organizacional, mantendo dessa forma o numero do nó atual e qual o nó pai correspondente.
Veja a implementação do nosso banco de dados no diagrama abaixo:
Figura 2 – Base de Dados da Árvore Organizacional do AD
Com a base de dados implementada, quando um usuário for inserido no AD, existirá um método que retornará toda a estrutura da árvore organizacional de forma a inserir um usuário no local apropriado.
Após implementar a nossa tabela, é hora de desenvolver a solução em Windows Forms para gerência da árvore de diretórios. O desenvolvimento desse projeto em Windows Forms será apresentado na parte 3 deste artigo. Antes disso quero deixar alguns links interessantes para quem for trabalhar com Active Directory em dotnet ou mesmo implementar uma solução como a descrita nesse projeto. Segue a lista abaixo:
1. http://www.c-sharpcorner.com/UploadFile/ecabral/
ADand.NET08242005065451AM/ADand.NET.aspx
2. http://www.codeproject.com/dotnet/activedirquery.asp
3. http://www.15seconds.com/issue/020730.htm
4. http://msdn.microsoft.com/library/default.asp?url=/library/en-us/adschema/
Até o próximo.