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