Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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..
active directory? advertising? wtf
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
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
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.
>
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.
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.
>
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
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.
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...";
}
}
?>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, digiteCN=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.
>
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..
consegui localizar os dados com a sua ajuda.. mas eu não consigo efetuar a consulta e apresentar.. preciso apenas do nome do cara e do grupo de trabalho dele..
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.
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);
?>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");
}// 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];
}$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!!
Único ad que conheço é relativo a anúncios '-'
Explica ae o que quis dizer com isso para que eu possa ajudar, seria db?