sexta-feira, 14 de outubro de 2016

DELPHI - Login AD/LDAP usando ADO - Login AD/LDAP using ADO

A função abaixo retorna TRUE se o usuário estiver válido no AD e False caso contrário.



{
Name               //Nome do Usuário Completo
sAMAccountName        // Nome do Usuario Logado(fulano.santos)
userAccountControl    //512 para usuario habilitado / 514 para usuario desabilitado
userPrincipalName     //Usuário com dominio (fulano.santos@dominio.com)
objectClass = 'User'  //para filtrar somente os objetos usuários no WHERE

EXEMPLO:
SELECT Name, sAMAccountName, userAccountControl FROM LDAP://dominio.com
WHERE objectClass = 'User' and sAMAccountName = 'fulano.santos'
}

//Data.DB, Data.Win.ADODB, System.SysUtils   <-- Declarar nas Uses


function ValidarLoginAD(Dominio, User, Password: String): Boolean;
var
  ADOCon :TADOConnection;
  ADOQuery :TADOQuery;
  SQL, NmUser :String;
  PosArroba :Integer;
const
  campos = 'Name, sAMAccountName, userAccountControl';
begin
  Result := False;

  PosArroba := Pos('@', User);
  NmUser := Copy(User, 1, Pos('@', User)-1); //copia o nome do usuario antes do @
  
  ADOCon := TADOConnection.Create(nil); //Cria os objetos de conexão
  ADOQuery := TADOQuery.Create(nil);
  try
    //Atribui as configurações
    ADOQuery.Connection := ADOCon;
    ADOCon.LoginPrompt := False;

    ADOCon.Provider := 'ADSDSOObject';
    ADOCon.Properties['User Id'].Value := User;
    ADOCon.Properties['Password'].Value := Password;
    ADOCon.Properties['Encrypt Password'].Value := True;
    //Gera o Select
    SQL := Format('SELECT %s FROM ''LDAP://%s'' WHERE objectClass = %s and sAMAccountName = %s',
      [campos, Dominio, QuotedStr('User'), QuotedStr(NmUser)]);
    ADOQuery.SQL.Text := SQL;

    try //Abre a conexão
      ADOQuery.Open;
      if ADOQuery.RecordCount > 0 then
      begin
        if ADOQuery.FieldByName('userAccountControl').AsInteger = 512 then //512 para usuario habilitado
          Result := True
        else
        if ADOQuery.FieldByName('userAccountControl').AsInteger = 514 then //514 para usuario desabilitado
          raise Exception.Create('User disabled');
      end;
    except on E :Exception do
      raise Exception.Create(E.Message);
    end;
  finally
    ADOQuery.Close;
    ADOCon.Connected := False;
    FreeAndNil(ADOCon);
    FreeAndNil(ADOQuery);
  end;
end;

4 comentários:

  1. OBS:
    – CN (Canonical Name): Será o nome do usuário
    – OU (Organizational Unit): Em qual OU a conta ficará armazenada.
    – DC (Domain Component): Especificamos o nome do domínio em que a conta será criada.

    ResponderExcluir
  2. Tive que fazer uma correção para funcionar aqui: quando o nome de usuário não tiver @, a variável NmUser deve receber o mesmo valor da variável User. Neste código, se não houver arroba, NmUser fica vazio, o que acaba gerando um erro.

    if posArroba = 0 then
    nmUser := User
    else
    NmUser := Copy(User, 1, Pos('@', User)-1);

    ResponderExcluir
  3. Vocês teriam um exemplo fazendo o login através do e-mail, que está configurado no AD?

    ResponderExcluir