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;
OBS:
ResponderExcluir– 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.
Você salvou a minha vida!!
ResponderExcluirTive 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.
ResponderExcluirif posArroba = 0 then
nmUser := User
else
NmUser := Copy(User, 1, Pos('@', User)-1);
Vocês teriam um exemplo fazendo o login através do e-mail, que está configurado no AD?
ResponderExcluir