Se você está começando como Gestor de TI, ou pensa em se tornar um, receba dicas para ter sucesso nessa posição (é grátis)!

Como listar usuários de seu Active Directory com PHP

Active Directory com PHP

Deseja gerar uma lista de usuários, com seus diversos atributos, a partir de seu servidor Active Directory com PHP. Leia este artigo, que lhe mostro como.

O problema

Comecei a implementar um projeto de Auditoria Contínua.

Um dos requisitos é identificar se há contas ativas no AD para colaboradores demitidos ou afastados, ou seja, de férias, em licença maternidade, em benefício INSS etc.

Caso sejam encontradas irregularidades, enviarei email para os responsáveis pela desativação das contas e para a auditoria interna.

Aqui apresento apenas a rotina que lista os usuários do AD e alguns de seus atributos.

 

Ambiente

Windows Server 2008 Standard

 

Solução

Terei uma rotina que comparará a lista de usuários ativos do AD (Active Directory) e a lista de empregados afastados (férias, licença maternidade, benefício INSS etc) e demitidos.

Caso alguma conta para esses usuários esteja ativa, um email com essa informação será enviado para os responsáveis pela ativação e desativação de contas e para a auditoria interna da companhia.

Parâmetros de entrada

  • IP ou nome do servidor AD
  • Domínio no formato xxxxx.com.br
  • Conta de administrador do AD
  • Senha da conta

Saída da função

Os resultados da consulta serão retornados em um Array de Strings, com a seguinte ordem:

  • nome: Nome do usuário.
  • login: Login para acesso à rede.
  • criado_em: Momento de criação da conta no AD.
  • ultimo_logon: Momento do último logon feito utilizando essa conta.
  • useraccountcontrol: Atributo utilizado para armazenar sinalizadores de status da conta. Maiores detalhes aqui.
  • conta_desabilitada :Indica se a conta está desbilitada (1) ou habilitada (0).
  • senha_nunca_expira: Indica se a senha nunca expira para essa conta (1) ou se expira de acordo com o parâmetro “pwdmaxage” (0).
  • senha_expirada: Indica se a senha se encontra expirada (1) ou se está normal (0).
  • grupos: Array que contém os grupos aos quais a conta faz parte.
  • nome_ad: Nome completo da conta, seguindo a nomenclatura defina pelo protocolo LDAP (Lightweight Directory Access Protocol).
  • ultima_troca_senha: Momento em que foi feita a útlima troca de senha.
  • proxima_troca_senha: Momento em que será necessária ser feita a próxima troca de senha, de acordo com o parâmetro “pwdmaxage“.
    Importante notar: se houver uma Group Policy (GPO) em algum grupo, que altere o comportamento da senha, esse valor não será alterado. Ainda não consegui encontrar uma forma de identificar essa questão.

 

Dependências

Servidor web com PHP configurado e que possibilite acesso ao seu servidor AD.

Em outras palavras, que não tenha bloqueios via firewall, ou esteja em uma rede inacessível.

 

Passos

  1. Em uma pasta de seu servidor web, crie um arquivo com o nome “testead.php” com o seguinte conteúdo:

    
    <?php
    
    function win2unix($wtime) {
      return ($wtime * 0.0000001) - 11644473600;
    }
    
    function formmat_oz($oztime) {
      return substr($oztime, 0, 4) . "-" . substr($oztime, 4, 2) . "-" . substr($oztime, 6, 2) . " " . substr($oztime, 8, 2) . ":" . substr($oztime, 10, 2) . ":" . substr($oztime, 12, 2);
    }
    
    function win2unixFmt($wtime) {
      return date('Y-m-d H:i:s', bcsub(bcdiv($wtime, '10000000'), '11644473600'));
    }
    
    function get_ad_users($server, $domain, $admin, $password) {   
      
      // Conecta ao servidor AD
      
      if(!($ldap = ldap_connect($server))) return false;
    
      ldap_set_option($ldap, LDAP_OPT_REFERRALS, 0);
      ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3);
            ldap_set_option($ldap, LDAP_OPT_SIZELIMIT, 0);
    
      $ldapbind = ldap_bind($ldap, $admin."@".$domain, $password);
    
      $dc = explode(".", $domain);
      $base_dn = "";
      foreach($dc as $_dc) $base_dn .= "dc=".$_dc.",";
      $base_dn = substr($base_dn, 0, -1);
          
      // Lê a quantidade maxima de dias para troca de senha setada para o dominio
      
      $sr = ldap_read($ldap, $base_dn, 'objectclass=*', array('maxPwdAge'));
      $info = ldap_get_entries($ldap, $sr);
      $maxpwdage = $info[0]['maxpwdage'][0];
      
      // Localiza todos usuarios 
    
      $sr=ldap_search($ldap, $base_dn, "(&(objectClass=user)(objectCategory=person))");
      $info = ldap_get_entries($ldap, $sr);
    
      for($i = 0; $i < $info["count"]; $i++)
      {
        $users[$i]["nome"] = $info[$i]["cn"][0];
        $users[$i]["login"] = $info[$i]["samaccountname"][0];
        $users[$i]["criado_em"] = formmat_oz($info[$i]["whencreated"][0]);
        $users[$i]["alterado_em"] = formmat_oz($info[$i]["whenchanged"][0]);
        
        if (isset($info[$i]["lastlogon"][0])) {
          $t = win2unix($info[$i]["lastlogon"][0]);
          $users[$i]["ultimo_logon"] = date("Y-m-d h:i:s", $t);
        } else {
          $users[$i]["ultimo_logon"] = "";
        }
        
        $users[$i]["useraccountcontrol"] = $info[$i]["useraccountcontrol"][0];
        
        if ($info[$i]["useraccountcontrol"][0] & 2) {
          $users[$i]["conta_desabilitada"] = "1";
        } else {
          $users[$i]["conta_desabilitada"] = "0";
        }
        
        if ($info[$i]["useraccountcontrol"][0] & 65536) {
          $users[$i]["senha_nunca_expira"] = "1";
        } else {
          $users[$i]["senha_nunca_expira"] = "0";
        }
        
        if ($info[$i]["useraccountcontrol"][0] & 8388608) {
          $users[$i]["senha_expirada"] = "1";
        } else {
          $users[$i]["senha_expirada"] = "0";
        }
    
        if (isset($info[$i]["memberof"][0])) {
          $saida = array();
          for ($z = 0; $z < sizeof($info[$i]["memberof"]) - 1; $z++) {
            $tempo = explode(",", $info[$i]["memberof"][$z]);
            
            for ($w = 0; $w < sizeof($tempo); $w++) {
              if (strpos($tempo[$w], "DC=") === false) {
                if (!in_array($tempo[$w], $saida)) {
                  $saida[] = $tempo[$w];
                }
              }
            }
          }
          
          sort($saida);
          $users[$i]["grupos"] = $saida;
        } else {
          $saida = array();
          $users[$i]["grupos"] = $saida;
        }
        
        $users[$i]["nome_ad"] = $info[$i]["distinguishedname"][0];      
        $users[$i]["ultima_troca_senha"] = win2unixFmt($info[$i]["pwdlastset"][0]);
        
        if (($users[$i]["senha_nunca_expira"] != "0") || ($users[$i]["conta_desabilitada"] != "0")){
          $users[$i]["proxima_troca_senha"] = "0";
        } else {
          $users[$i]["proxima_troca_senha"] = win2unixFmt(bcsub($info[$i]["pwdlastset"][0], $maxpwdage));
        }
    
      }
    
      return $users;
    }
    
    $users = get_ad_users("<servidor>", "<dominio>", "<conta_adm>", "<senha>");
    
    echo "<pre>";
    print_r($users);
    echo "</pre>";
    
    ?>
    

  2. Através de seu browser acesse o arquivo criado no passo anterior.

    Teste Active Directory

A rotina proposta é bastante simples, mas pode ser adaptada facilmente a rotinas mais complexas que atendam a sua necessidade.

 

Outros artigos relacionados

 

Gostou do post?

Gostaria muito de saber sua opinião sobre o conteúdo através de um comentário seu logo aqui abaixo.

Caso ele tenha sido útil para você, aproveite para compartilhá-lo com um amigo ou amiga que precise de idéias como essas para ajudar em seu dia a dia.

Se quiser que avise sempre que houver uma atualização, deixe seu email abaixo.

Informe seu email e clique no botão ENVIAR!

Até o próximo post!

14 Comments

Add a Comment

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *