Nov
13
Script Perl para consultas em base LDAP e/ou Active Directory
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.brVocê 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: