Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Paulo Roberto Neves

[Resolvido] Consultar ad usando php

Recommended Posts

Boa Tarde,

 

já consegui verificar o usuário logado com "$_SERVER['LOGON_USER']", agora eu gostaria de utilizar essa informação e executar uma espécie e query no ad e capturar as propriedades do usuário, tal como, Nome Completo, email e grupo.

 

Será que alguém consegue me ajudar?

 

Vlw galera..

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu não sei exatamente a forma de fazer, mas o que você pode ser feito com a função ldap do PHP

 

http://php.net/manual/pt_BR/book.ldap.php

 

Provavelmente esta função faz isto: http://www.php.net/manual/pt_BR/function.ldap-get-entries.php

 

Se não for ela, alguma outra da lista de funções do primeiro link deve fazer...

 

Qualquer coisa procura por ldap + php no google que você vai conseguir algo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vlw galera.. vou explicar melhor.rsrsr

 

Consegui pegar o user do usuário logado no AD(active directory), porém eu gostaria de pegar o resto das informações dele tb.

 

mas eu vou tentar o que o rafpv disse.

 

Volto para dar notícias..

 

muito obrigado a todos

Compartilhar este post


Link para o post
Compartilhar em outros sites

Toda o acesso do PHP para o AD, é feito através das funções ladp.

 

Entretanto, para retornar informações específicas de um usuário, você deve usar a função ldap_search()

Um exemplo:

$searchResults = ldap_search($conexao, $dn, '(|(samaccountname='.$usuario.'))');   

 

SamAccountName seria a chave primária do AD.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Toda o acesso do PHP para o AD, é feito através das funções ladp.

 

Entretanto, para retornar informações específicas de um usuário, você deve usar a função ldap_search()

Um exemplo:

$searchResults = ldap_search($conexao, $dn, '(|(samaccountname='.$usuario.'))');   

 

SamAccountName seria a chave primária do AD.

 

nunca usei ldap nem sei com conectar.. mas vou tentar..

 

outra coisa.. eu preciso instalar OpenLDAP em meu servidor?..

tenho um 2008 com iis7 + php e mysql.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não é difícil, só necessita de algumas configurações. Segue uma classe simples para o trabalho com o AD.

 

Segue uma adaptação da classe que eu criei para o sistema da empresa que eu trabalhava. Na minha ela realiza operações CRUD no AD também. O que não é sua necessidade.

 

<?php
/**
* Class ActiveDirectory
* @author Gabriel Heming <gabriel_heming@hotmail.com>
* 
*/ 
class ActiveDirectory {

   private $ldap;//conexão básica do AD
   private $ldapBind;//conexão avançada do AD 
   private $serverAD = 'ldap://192.168.1.1';//IP do servidor LDAP
   private $userAD = 'usuario';//usuario para acesso geral do AD
   private $domain = '@dominio.com.br';
   private $passwordAD = 'senha';//senha para acesso geral do AD
   private $dnAD = 'cn=Gabriel heming,ou=TI,dc=MeuDominio,dc=com';//Especifique o caminho CN (Common Name), OU(Organizational Unit), DC(Domain Component). Lembrando que é ao contrário LOL
   private $protocolVersion = 3;


   public function __construct() {
       $ldap = ldap_connect($this->serverAD) or die('não foi possível conectar'); 
       $this->ldap = $ldap;
       $this->ldapBind = false;
   }


   private function connect() {
       if($this->ldapBind === false) {        
           $this->ldapBind = $this->ldap;
           if ( !ldap_set_option($this->ldapBind, LDAP_OPT_PROTOCOL_VERSION, $this->protocolVersion ) ) {
               exit( 'Falha em definir protocolo na versao '.$this->protocolVersion );
           }
           ldap_set_option($this->ldapBind, LDAP_OPT_REFERRALS, 0 );
           ldap_bind($this->ldapBind);
           if ( ldap_errno($this->ldapBind) !== 0 ) {
               exit('Nao foi possivel conectar no servidor');
           }
           ldap_bind($this->ldapBind , $this->userAD.$this->domain , $this->passwordAD);
           if (ldap_errno($this->ldapBind) !== 0) {
               return false;
           }   
       }
       return true;
   }

   public function isUser($user) {        
       if($this->connect() === true) {
           $searchResults = ldap_search($this->ldapBind, $this->dnAD, '(|(samaccountname='.$usuario.'))');
           if (count(ldap_get_entries($this->ldapBind , $searchResults)) > 1) {
               return true; 
           } 
       }
       return false;
   }

   public function authUser($user , $password) {   
       if (strlen($senha) > 0) {
           $bind = ldap_bind($this->ldap , $user.$this->domain , $password);
           if ($bind) {
               return true;
           }
       }
       return false;
   }

   public function getUser($user) {    
       if($this->connect() === true) {
           $searchResults = ldap_search($this->ldapBind , $this->dnAD , '(|(samaccountname='.$user.'))');        
           if (count(ldap_get_entries($this->ldapBind , $searchResults)) > 1) {
               $object = ldap_get_entries($this->ldapBind , $searchResults);
               $user = $object[0];
               return $user; 
           }
       }
       return false;
   }
}

 

Então, é isso, é uma classe bem básica. Vai te servir para o que você precisa.

Como a conexão avançada não é sempre necessária, as funções que necessitam ela, fazem a sua chamada. As operações básicas, utilizam apenas da conexão padrão.

 

Talvez haja alguns nomes de variáveis erradas, pois eu utilizo outras classes em conjunto. Qualquer coisa eu corrijo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não é difícil, só necessita de algumas configurações. Segue uma classe simples para o trabalho com o AD.

 

Segue uma adaptação da classe que eu criei para o sistema da empresa que eu trabalho. Na minha ela realiza operações CRUD no AD também. O que não é sua necessidade.

 

<?php
/**
* Class ActiveDirectory
* @author Gabriel Heming <gabriel_heming@hotmail.com>
* 
*/ 
class ActiveDirectory {

   private $ldap;//conexão básica do AD
   private $ldapBind;//conexão avançada do AD 
   private $serverAD = 'ldap://192.168.1.1';//IP do servidor LDAP
   private $userAD = 'usuario';//usuario para acesso geral do AD
   private $domain = '@dominio.com.br';
   private $passwordAD = 'senha';//senha para acesso geral do AD
   private $dnAD = 'cn=Gabriel heming,ou=TI,dc=MeuDominio,dc=com';//Especifique o caminho CN (Common Name), OU(Organizational Unit), DC(Domain Component). Lembrando que é ao contrário LOL
   private $protocolVersion = 3;


   public function __construct() {
       $ldap = ldap_connect($this->serverAD) or die('não foi possível conectar'); 
       $this->ldap = $ldap;
       $this->ldapBind = false;
   }


   private function connect() {
       if($this->ldapBind === false) {        
           $this->ldapBind = $this->ldap;
           if ( !ldap_set_option($this->ldapBind, LDAP_OPT_PROTOCOL_VERSION, $this->protocolVersion ) ) {
               exit( 'Falha em definir protocolo na versao '.$this->protocolVersion );
           }
           ldap_set_option($this->ldapBind, LDAP_OPT_REFERRALS, 0 );
           ldap_bind($this->ldapBind);
           if ( ldap_errno($this->ldapBind) !== 0 ) {
               exit('Nao foi possivel conectar no servidor');
           }
           ldap_bind($this->ldapBind , $this->userAD.$this->domain , $this->passwordAD);
           if (ldap_errno($this->ldapBind) !== 0) {
               return false;
           }   
       }
       return true;
   }

   public function isUser($user) {        
       if($this->connect() === true) {
           $searchResults = ldap_search($this->ldapBind, $this->dnAD, '(|(samaccountname='.$usuario.'))');
           if (count(ldap_get_entries($this->ldapBind , $searchResults)) > 1) {
               return true; 
           } 
       }
       return false;
   }

   public function authUser($user , $password) {   
       if (strlen($senha) > 0) {
           $bind = ldap_bind($this->ldap , $user.$this->domain , $password);
           if ($bind) {
               return true;
           }
       }
       return false;
   }

   public function getUser($user) {    
       if($this->connect() === true) {
           $searchResults = ldap_search($this->ldapBind , $this->dnAD , '(|(samaccountname='.$user.'))');        
           if (count(ldap_get_entries($this->ldapBind , $searchResults)) > 1) {
               $object = ldap_get_entries($this->ldapBind , $searchResults);
               $user = $object[0];
               return $user; 
           }
       }
       return false;
   }
}

 

Então, é isso, é uma classe bem básica. Vai te servir para o que você precisa.

Como a conexão avançada não é sempre necessária, as funções que necessitam ela, fazem a sua chamada. As operações básicas, utilizam apenas da conexão padrão.

 

Talvez haja alguns nomes de variáveis erradas, pois eu utilizo outras classes em conjunto. Qualquer coisa eu corrijo.

 

cara..me desculpa... não sei muito sobre php.. sei apenas o basico..

 

fiquei totalmente confuso com tudo que eu vi rsrsrr

 

se não fosse abusar d mais.. você poderia fazer uma conexão e uso

"$searchResults = ldap_search($conexao, $dn, '(|(samaccountname='.$usuario.'))'); " pra depois eu entender como consultar o resto e até tentar melhor a criação de usuários no AD...

Obrigado novamente

Compartilhar este post


Link para o post
Compartilhar em outros sites

Claro, sem problemas.

 

Como já existe a classe, é de forma simples que se utiliza dela.

Segue:

//Instancia
$activeDirectory = new ActiveDirectory();

//Autenticando um usuario
if($activeDirectory->authUser('gabrielheming' , '123456')){
  echo 'Usuário autenticado';
} else {
  echo 'Usuário ou senha inválido';
}

//Verificando se um usuário existe no AD
if($activeDirectory->isUser('gabrielheming')){
  echo 'Usuário existe';
} else {
  echo 'Usuário não existe';
}

//Retornando as informações do usuário
$user = $activeDirectory->getUser('gabrielheming');
var_dump($user);

 

Esse é o funcionamento básico.

Na classe, os atributos que você precisará alterar são esses:

private $serverAD = 'ldap://192.168.1.1';//IP do servidor LDAP
private $userAD = 'usuario';//usuario para acesso geral do AD
private $domain = '@dominio.com.br';
private $passwordAD = 'senha';//senha para acesso geral do AD
private $dnAD = 'cn=Gabriel heming,ou=TI,dc=MeuDominio,dc=com';//Especifique o caminho CN (Common Name), OU(Organizational Unit), DC(Domain Component).

Esse atributos são específicos do seu servidos de AD

 

Com isso, você pode trabalhar no AD.

Compartilhar este post


Link para o post
Compartilhar em outros sites

sei que já estou abusando.. mas como tenho cara de Pau! rsrsrs

Eu achei esse código e funcionou e o pior eu consegui compreender. rssrsr. mas não consigo associar com o ldap_search por causa da variável $dn. não sei onde eu encontro.. e na verdade eu estou meio perdido com tanta informação que devo retirar do AD. rssrs

 

Você consegue me ajudar?

 

<?php

// using ldap bind
$ldaprdn  = 'user@dominio.com.br';     // ldap rdn or dn
$ldappass = 'pass';  // associated password

// connect to ldap server
$ldapconn = ldap_connect("endereço da máquina")
   or die("Could not connect to LDAP server.");

if ($ldapconn) {

   // binding to ldap server
   $ldapbind = ldap_bind($ldapconn, $ldaprdn, $ldappass);

   // verify binding
   if ($ldapbind) {
       echo "LDAP bind successful...";
   } else {
       echo "LDAP bind failed...";
   }

}



?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esse seu código, realiza somente a autenticação do usuário. Que é o mesmo que é feito no método authUser mostrado no meu exemplo.

 

A variável $dn é o caminho "base DN". Retirado do manual da Microsoft:

Base DN é o ponto inicial da hierarquia do Active Directory na qual sua busca começará. Na caixa Base DN, digite

CN=Schema,CN=Configuration,dc=meu_domínio,dc=com

 

A questão do "meu domínio", é sempre iniciado com @. Ele não é necessariamente o e-mail, mas parece ser por possuir a @.

 

Se você olhar aqui, vai ver como encontrar as informações necessárias.

http://support.microsoft.com/kb/224543/pt-br

Eu não consigo lhe informar mais, pois trabalho no AD diretamente com o PHP. Os dados de conexão, eu recebia prontos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esse seu código, realiza somente a autenticação do usuário. Que é o mesmo que é feito no método authUser mostrado no meu exemplo.

 

A variável $dn é o caminho "base DN". Retirado do manual da Microsoft:

 

 

A questão do "meu domínio", é sempre iniciado com @. Ele não é necessariamente o e-mail, mas parece ser por possuir a @.

 

Se você olhar aqui, vai ver como encontrar as informações necessárias.

http://support.microsoft.com/kb/224543/pt-br

Eu não consigo lhe informar mais, pois trabalho no AD diretamente com o PHP. Os dados de conexão, eu recebia prontos.

 

muito obrigado cara.. você está me ajudando muito... vou tentar achar essas informações e passo para atualizar meu desempenho..

Compartilhar este post


Link para o post
Compartilhar em outros sites

Um tempo atrás, eu havia mapeado como buscar cada informação. Existem centenas, havia completado coisa de 80%. Mas então, não havia necessidade de ter todas. Por sorte, ainda possuo uma pequena tabela comigo, segue ela:

 


$activeDirectory = new ActiveDirectory();
//Retornando as informações do usuário
$user = $activeDirectory->getUser('gabrielheming');
$user['samaccountname'][0];/** Usuário do AD - samaccountname **/
$user['dn'];/** DistinguedshedName - DN **/
$user['displayname'][0];/** Nome completo - de exibição **/
$user['givenname'][0];/** Primeiro nome **/
$user['sn'][0];/** Sobrenome **/
$user['c'][0];/** Sigla do país. Ex.: BR **/
$user['l'][0];/** Cidade **/
$user['st'][0];/** Estado. Igual ao de cima **/
$user['description'][0];/** descrição **/
$user['postalcode'][0];/** CEP **/
$user['initials'][0];/** Iniciais do nome **/
$user['co'][0];/** Nome do país. Ex.: Brasil **/
$user['countrycode'][0];/** Código do pais. Ex: 76 (brasil) **/
$user['streetaddress'][0];/** Logradouro **/
$user['mail'][0];/** Email **/
$user['telephonenumber'][0];/** Telefone principal, Número único**/ 
$user['othertelephone'];/** Outros telefones. Vetorial**/

 

É isso ai. Por algum motivo, que eu não me lembro exatamente, em alguns atributos você necessita pegar somente o índice [0], outros não há necessidade.

Compartilhar este post


Link para o post
Compartilhar em outros sites

cara.. tudo certo consegui.. já estou até filtrando pra poder pegar apenas um usuário..no caso o logado..

 

mas to com outro problema..

 

quando eu tenho um usuário do ad com dois nomes tipo "paulo.neves" o filtro não funciona. agora quando tenho um apenas. tipo "paulo" ele funciona.. você sabe como posso corrigir? e to tentando pegar a ou que o usuário esta criado. mas não sei como.. muito obrigado.. segue abaixo o código

<?php


$ldap_server = "ldap://svdmcp3.tiisa.com.br";
$auth_user = "tiisa\paulo.neves";
$auth_pass = "*******";
$usuario = "paulo.neves";

// Set the base dn to search the entire directory.

$base_dn = "ou=tiisa, dc=tiisa, dc=com, dc=br";

// Show People
$filter = "(&(objectClass=user)(objectCategory=person)(cn=*)(samaccountname=$usuario))";



// connect to server

if (!($connect=@ldap_connect($ldap_server))) {
die("Could not connect to ldap server");
}

// bind to server

if (!($bind=@ldap_bind($connect, $auth_user, $auth_pass))) {
die("Unable to bind to server");
}

// search active directory

if (!($search=@ldap_search($connect, $base_dn, $filter))) {
die("Unable to search ldap server");
}

$number_returned = ldap_count_entries($connect,$search);
$info = ldap_get_entries($connect, $search);


echo "The number of entries returned is ". $number_returned."<p>";

for ($i=0; $i<$info["count"]; $i++) {
// echo "Name is: ". $info[$i]["name"][0]."<br>";


echo "Name: ". $info[$i]["displayname"][0]."<br>";
echo "Email: ". $info[$i]["mail"][0]."<br>";
echo "Fone: ". $info[$i]["telephonenumber"][0]."<br>";
echo "CONTA AD.: ". $info[$i]["samaccountname"][0]."<br>";
echo "GRUPO.: ". $info[$i][""][0]."<p>";//aqui "OU AD" do usuário que tem o mesmo nome do grupo

}


ldap_close($connect);
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Gente.. eu consegui..

 

A ideia deste código é utilizar ele para capturar o Nome e email do usuário logodo no domínio. ou seja o cara vai entrar na pagina e pelo login da máquina vai localizar ele no AD e utilizar as informações para automatizar e otimizar o sistema.. sem a necessidade do cara se conectar novamente.. esta ferramenta vai servir para alimentar uma base com as informações pertinentes.

 

eu gostaria de agradecer a todos que me ajudaram, em especial o Gabriel Heming que me direcionou na busca da solução adequada.

 

segue código finalizado e comentado.

 

Código responsável pela conexão. arquivo com nome de ConexaoAD.php

<?php

// identificação do servidor, usuário e senha.
$ldap_server = "ldap://nome ou ip do domain controler";
$auth_user = "domínio\usuário";
$auth_pass = "senha";

// identificação da base que será acessada.
$base_dn = "Ou=principal, dc=dominio, dc=com, dc=br";

// conexão com o servidor.
if (!($connect=@ldap_connect($ldap_server))) {
die("Could not connect to ldap server");
}

// conexão autentica com o servidor.
if (!($bind=@ldap_bind($connect, $auth_user, $auth_pass))) {
die("Unable to bind to server");
}

?>

 

Código responsável pela identificação do usuário e busca dos dados. arquivo de nome DadosUserAD.php

<?php

 // importação do código anterior
 require_once('ConectAD.php');

?>

<?php

 // usuário do AD logado na máquina, ele separa usuário e domínio casso o meu ficaria sem o "*****\" que tem 6 caracteres
 $usuario = substr($_SERVER['LOGON_USER'], 6);





// Este filtro você pode utilizar pra trazer todos os usuário de uma OU. no lugar do " '(|(samaccountname='.$usuario.'))' "(sem as "").
$filter = "(&(objectClass=user)(objectCategory=person)(cn=*))";//este filtro serve quando você não quer filtrar pelo usuário e capturar todos que existem no ad de uma determinada OU


// Busca no AD

if (!($search=@ldap_search($connect, $base_dn, '(|(samaccountname='.$usuario.'))'))) {
die("Unable to search ldap server");
}
// verificar o número de usuários localizados no AD.
$number_returned = ldap_count_entries($connect,$search);

// condição que verifica se o usuário foi localizado na base padrão. No meu cado eu possuo uma ou principal para usuários normais e outra pra usuário administradores.
if ($number_returned<="0"){
$erro = 1;
$base_dn = "Ou=Administradores, dc=tiisa, dc=com, dc=br";
if (!($search=@ldap_search($connect, $base_dn, '(|(samaccountname='.$usuario.'))'))) ;
       $number_returned = ldap_count_entries($connect,$search);
}

// captura dos dados
$info = ldap_get_entries($connect, $search);

// definição das variáveis referente ao usuário
if($number_returned>0){
for ($i=0; $i<$info["count"]; $i++) {

  // definição das variáveis.
  $userad = $info[$i]["name"][0];
  $mailad = $info[$i]["mail"][0];


}
}else{

$userad = "Usuário Não Cadastrado";
$mailad = "";
$usuario = "";
}

// Impressão dos dados localizados no AD
echo $userad."<br>";
echo $mailad."<br>";
echo $usuario."<br>";


ldap_close($connect);
?>

 

Muito Obrigado mais uma vez!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.