Nov
13

Script Perl para consultas em base LDAP e/ou Active Directory

Autor // Kleber Povoacao

Apresentação

Olá pessoal,

O que me levou a escrever este artigo foi o fato de precisar integrar uma ferramenta de telefonia com um software que fizesse uma consulta a uma base do Active Directory. Para quem não sabe um Active Directory da Microsoft não é nada mais que uma base LDAP.

Para um perfeito entendimento deste artigo é recomendado que se tenha alguns fundamentos em LDAP e Perl. No final do texto há alguns links sobre o assunto.

Este é meu primeiro artigo e espero que seja útil para vocês.

Pré-requisitos

Ter o Perl instalado e funcionando, é obvio.

Instalar o módulo perl::ldap, que pode ser encontrado em:

* http://search.cpan.org/~gbarr/perl-ldap-0.33/

Instalar o modulo Convert::ASN1, que pode ser encontrado em:

* http://search.cpan.org/~gbarr/Convert-ASN1-0.20/


Para instalar os módulos é só seguir a documentação do arquivo INSTALL que vem junto com os módulos ou entrar no link:

* A forma correta de se instalar módulos Perl

Ajustar o firewall do seu servidor para permitir as consultas pela porta 389.

Cenário

Imagine seu domínio seja este: www.meudominio.com.br

Você provavelmente configurou seu openLDAP ou seu Active Directory assim:

cn=meudominio,cn=com,cn=br

O nome do nosso servidor é: SERVER

Código

Agora vamos ao código comentado:

use warnings;
use strict;
use Net::LDAP;#Esta linha carrega as funções do Perl com suporte LDAP
©rights; #Muito importante essa linha
my $SERVIDOR="SERVER"; #Nome do nosso servidor
#Olha o nosso domínio aqui ou tecnicamente nosso DN=Distinguished Name
my $BASE="dc=meudominio,dc=com,dc=br"; 
my $ATRIBUTOS="lockoutTime,sAMAccountName,description,cn"; 
#Aqui estão todos os campos que eu quero que traga na consulta, 
#no meu caso eu quero os campos 
cn=common name
description=traz uma descrição do usuário
sAMAccountName=O nome real do usuário no Active directory
lockoutTime=me traz o tempo que o usuário já esta bloqueado no sistema
 
#Aqui é o filtro que eu vou usar na pesquisa, no caso 
#eu vou procurar pelo nome do usuário
my $FILTRO="cn"; 
 
my $ldap = Net::LDAP->new( "$SERVIDOR" ) or die "$@"; 
print "Digite o usuário a ser localizado : ";
chop(my $user=);
 
my $mesg=$ldap->bind; 
# ESTA LINHA ACIMA CONECTA-SE NO SERVIDOR 
# PARA FAZER UMA CONSULTA ANÔNIMA, OU SEJA, 
# CONECTA-SE SEM USUÁRIO E SENHA UTILIZANDO PORTA 389. 
# OBS: POR PADRÃO O ACTIVE DIRECTORY 
# NÃO ACEITA CONSULTAS ANONIMAS. 
# SE PRECISAR DE CONSULTA COM USUÁRIO E SENHA 
# UTILIZE A SEGUINTE LINHA: 
my $mesg=$ldap->bind 
 ("meu_usuario@$SERVIDOR", password=>"minha_senha"); 
 
# SUBSTITUINDO-SE MEU_USUÁRIO PELO SEU USUÁRIO 
# E MINHA_SENHA POR SUA SENHA CUIDADO, 
# AS SENHAS SÃO PASSADAS EM PLAIN TEXT PELA REDE,
# ENTÃO NESSE CASO UTILIZE O NET::LDAPS DO PACOTE 
# PERL-LDAP O QUAL OFERECE COMUNICAÇÃO SEGURA 
# PELA PORTA 636. MAIS INFORMAÇÕES SOBRE NET::LDAPS 
# VEJA OS LINKS NO FINAL DO ARTIGO.
 
$mesg = $ldap->search
 ( base=>"$BASE",filter=>"$FILTRO=*$user*",attrs=>"$ATRIBUTOS"); 
#A pesquisa usando todos critérios acima
 
$mesg->code && die $mesg->error;
 
#Estamos contando qtos usuários foram localizados
my $count = $mesg->count;
 
for (my $i=0; $i<$count; $i++) 
{
#pegamos um usuário e atribuímos à variável entry
my $entry = $mesg->entry($i); 
#Atribuição do valor de lockoutTime a variável lockado
my $lockado=int($entry->get_value('lockoutTime')); 
 
#Impressão dos dados na tela. 
#Quais dados ? Os ATRIBUTOS do inicio do programa
print "Nome : ",$entry->get_value('cn')," ",
"Descrição : ",$entry->get_value('description')," ",
"Usuário : ",$entry->get_value('sAMAccountName')," ";
if ($lockado == 0 ) 
#Verificação se usuário esta bloqueado. 
#Se tiver valor igual a 0 usuário não esta lockado.
{
$lockado="Não";
print "Usuário bloqueado ?: ",$lockado;
}
else
{
$lockado="Sim";
print "Usuário bloqueado ?: ",$lockado;
}
print " -------------------------- ";
my $lixo=<STDIN>;
}
$mesg = $ldap->unbind; # derrubar conexão
 
 
sub copyrights
{
print "Copyright 2006, 2006 Kleber Povoacao kleber at gmail.com 
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA ";
}

Finalização

Acho que vocês puderam ter uma idéia de como usar software livre para consultar uma base de usuários livre ou propietária.

Aqui fiz apenas uma consulta à base de dados. É possível escrever uma ferramenta complexa para consultar, adicionar e alterar toda uma base.

Deixo aqui alguns links úteis para se aprofundarem no assunto. Até mais!

Referências

* http://search.cpan.org/~gbarr/perl-ldap-0.33/lib/Net/LDAP/Examples.pod
* http://www.ldap.org.br http://www.computerperformance.co.uk/...active_directory.htm

Artigos Relacionados:

blog comments powered by Disqus