Pessoal estou inserindo no blog uma classe para manipulação do MS Active directory é bem simples e funcional, depois que criei não preciso mais ficar esquentando a cabeça com login e permissão de grupo na minha aplicação. Qualquer duvida só postar.
<?php
class adLDAP{
protected static $permissao_grupo = false;
protected static $pertence_grupo = false;
public static function Login($ldapdsn, $array_grupo = null)
{
if($ldapdsn['conexao']){
$filtro = "(&(objectCategory=person)(sAMAccountName=".$ldapdsn['usuario']."))";
$atributo = array('dn','mail','memberof');
$dados_login = adLDAP::search($ldapdsn['conexao'], $ldapdsn['basedn'], $filtro, $atributo);
if($dados_login){
if(!empty($array_grupo)){
if(!empty($dados_login[0]['memberof'])){
foreach ($dados_login[0]['memberof'] as $chave => $valor){
if($chave !== 'count'){
$cngrupo = explode(',',$valor);
$nomegrupo = explode('=',$cngrupo[0]);
if(in_array($nomegrupo[1], $array_grupo)){
adLDAP::$permissao_grupo = true;
}
}
}
if(adLDAP::$permissao_grupo){
return $dados_login;
}else{
return false;
}
}else{
return false;
}
}else{
return $dados_login;
}
}else{
return false;
}
}else{
return false;
}
}
public static function search($conexao, $basedn, $filtro, $atributo = null){
if(empty($atributo)){
$pesquisa = @ldap_search($conexao, $basedn, $filtro) or die(false);
}else{
$pesquisa = @ldap_search($conexao, $basedn, $filtro, $atributo) or die(false);
}
if($pesquisa){
$TotalReg = @ldap_get_entries($conexao, $pesquisa);
return $TotalReg;
}else{
return false;
}
}
public static function searchCustom($conexao, $basedn, $objectCategory, $objectProperties, $objectPropertiesValue, $atributo = null){
//$conexao: Conexão Ldap
//$basedn: Dn principal de busca, no caso do ad de exemplo é ou=outeste,dc=teste,dc=local
//$objectCategory: É a categoria de busca do objeto dentro do AD ex: groups(buscar por grupos), person(Pessoas), ou(Ou´s)
//$objectProperties: É a propriedade da categoria a ser pesquisada ex: para grupos pode ser name, para usuarios samAccountName e etc.
//$objectPropertiesValue: É o valor a ser pesquisado (*) pesquisa tudo, ou podemos especificar o valor referente ao $objectProperties como name a ser pesquisado ou o samAccountName.
//$atributo = Atributos de retorno da pequisa, esta variavel deve ser preenchida e separada por virgula;
if(!empty($objectCategory) && !empty($objectProperties) && !empty($objectPropertiesValue)){
$filtroBuscaAd = "(&(objectCategory=".$objectCategory.")(".$objectProperties."=".$objectPropertiesValue."))";
if(empty($atributoAd)){
$arrayAributos = explode(',',$atributo);
$pesquisa = ldap_search($conexao, $basedn, $filtroBuscaAd, $arrayAributos) or die(false);
}else{
$pesquisa = ldap_search($conexao, $basedn, $filtroBuscaAd) or die(false);
}
}else{
return false;
}
if($pesquisa){
$TotalReg = ldap_get_entries($conexao, $pesquisa);
return $TotalReg;
}else{
return false;
}
}
public function Logout()
{
}
public static function pesquisaMembrosGrupo($conexao, $basedn, $nomeGrupo){
$filtro = "(&(objectClass=group)(cn=".$nomeGrupo."))";
$atributo = array('dn','cn','member');
$membros = adLDAP::search($conexao, $basedn, $filtro, $atributo);
if($membros){
if(isset($membros[0]['member']) && !empty($membros[0]['member'])){
return $membros ;
}else{
return false;
}
}else{
return false;
}
}
public static function eMembroDoGrupo($conexao, $basedn, $nomeGrupo, $usuario){
$array_usuario = explode('@', $usuario);
$usuario = $array_usuario[0];
$filtro = "(&(objectCategory=person)(sAMAccountName=".$usuario."))";
$atributo = array('dn','mail','memberof');
$dados_login = adLDAP::search($conexao, $basedn, $filtro, $atributo);
if(!empty($dados_login[0]['memberof'])){
foreach ($dados_login[0]['memberof'] as $chave => $valor){
if($chave !== 'count'){
$cngrupo = explode(',',$valor);
$nomegrupo = explode('=',$cngrupo[0]);
if($nomegrupo[1] == $nomeGrupo){
adLDAP::$pertence_grupo = true;
}
}
}
if(adLDAP::$pertence_grupo){
return true;
}else{
return false;
}
}else{
return false;
}
}
public function CriarUsuarioAd($conexao, $dadosUsuario){
$usuarioAd = explode('@', $dadosUsuario['email']);
$ouUsuario = self::PesquisaOU($conexao, $dadosUsuario['basedn'], $dadosUsuario['instituto']);
if($ouUsuario)
{
$dn_ldap = 'cn='.$usuarioAd[0].',ou='.$dadosUsuario['instituto'].', '.$dadosUsuario['basedn'];
}
else
{
$dn_ldap = 'cn='.$usuarioAd[0].', '.$dadosUsuario['basedn'];
}
$testeSenha = self::converteSenhaPadraoAd($dadosUsuario['senha']);
$ldaprecord['objectclass'][0] = "top"; //Obejto fixo e obrigatorio para criação de usuario
$ldaprecord['objectclass'][1] = "person"; //Obejto fixo e obrigatorio para criação de usuario
$ldaprecord['objectclass'][2] = "organizationalPerson"; //Obejto fixo e obrigatorio para criação de usuario
$ldaprecord['objectclass'][3] = "user"; //Obejto fixo e obrigatorio para criação de usuario
$ldaprecord['pager'] = $dadosUsuario['cpf'];
$ldaprecord['company'] = $dadosUsuario['instituto']; ///Esse dado ainda não esta vindo do cadprof por isso esta comentado, quando disponivel apenas descomente a linha
$ldaprecord["displayName"] = $dadosUsuario['nome']." ".$dadosUsuario['sobrenome'];
$ldaprecord["givenName"] = $dadosUsuario['nome'];
$ldaprecord["mail"] = $dadosUsuario['email'];
$ldaprecord["name"] = $usuarioAd[0]; //igual a cn
$ldaprecord["sAMAccountName"] = $usuarioAd[0]; //este nome deve ser unico assim como a cn
$ldaprecord["sn"] = $dadosUsuario['sobrenome'];
$ldaprecord["userPrincipalName"] = $usuarioAd[0]."@".$dadosUsuario['dominio']; // este nome deve ser unico assim como a cn
$ldaprecord["userAccountControl"] = 66080;// Cria conta com usuario habilitado e a senha nunca expira
$ldaprecord["pwdLastSet"] = -1;// sem troca de senha no proximo logon
$ldaprecord["unicodepwd"]= self::converteSenhaPadraoAd($dadosUsuario['senha']); //senha ja convertida para padrao AD
ldap_set_option($conexao, LDAP_OPT_REFERRALS, 0);
$resposta = @ldap_add($conexao, $dn_ldap, $ldaprecord) or die(false);
if($resposta){
return $resposta;
}else{
throw new Exception('Erro ao criar usuario no AD Classe Ldap');
}
}
static function DeletarUsuarioAd($conexao, $dadosUsuario){
$usuarioAd = explode('@', $dadosUsuario['email']);
$ouUsuario = self::PesquisaOU($conexao, $dadosUsuario['basedn'], $dadosUsuario['instituto']);
if($ouUsuario)
{
$dn_ldap = 'cn='.$usuarioAd[0].',ou='.$dadosUsuario['instituto'].', '.$dadosUsuario['basedn'];
}
else
{
$dn_ldap = 'cn='.$usuarioAd[0].', '.$dadosUsuario['basedn'];
}
$retorno = @ldap_delete($conexao, $dn_ldap);
if($retorno){
return $retorno;
}else{
throw new Exception('erro ao remover usuario do AD');
}
}
static function alteraSenhaAd($conexao, $cn, $senha)
{
ldap_set_option($conexao, LDAP_OPT_REFERRALS, 0);
$Arraysenha['unicodepwd'] = self::converteSenhaPadraoAd($senha);
$resultado = @ldap_modify($conexao, $cn, $Arraysenha);
if($resultado){
return true;
}else{
return false;
}
}
static function converteSenhaPadraoAd($senha){
if(!empty($senha)){
//$senha_padrao_ad = null;
//codigo para alteração de senha no AD em versões anteriores a win2003 server
/*
$len = strlen($senha);
for($i=0;$i<$len;$i++){
$senha_padrao_ad .= "{$senha{$i}}\000";
}*/
$senha = "\"". $senha . "\"";
$senha_padrao_ad = mb_convert_encoding($senha, "UTF-16LE");
return $senha_padrao_ad;
}else{
return false;
}
}
static function PesquisaOU($conexao, $basedn, $instituto){
$filtro = '(&(objectClass=organizationalUnit)(ou='.$instituto.'))';
$atributo = "";
$ou = self::search($conexao, $basedn, $filtro, $atributo);
if($ou){
if(!empty($ou['count'])){
return $ou;
}else{
return false;
}
}else{
return false;
}
}
}
?>
Nenhum comentário:
Postar um comentário