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;