ich möchte wissen, ob ein Benutzer die richtige Kombination aus Domäne, Benutzer und Kennwort für seinen Active Directory-Benutzer eingibt.Überprüfen Sie, ob die Benutzerauthentifizierung in Active DIrectory
Ich habe versucht, ein sehr einfaches Programm zu erstellen, das keine Verbindung herstellen kann, aber durch das Lesen der Fehlermeldung kann ich wissen, ob der Benutzer/das Passwort korrekt ist.
Dies ist Trick basiert (die Logik ist auf das Lesen der Ausnahme Nachricht), jedenfalls habe ich diesen Prototyp auf 2 Servern getestet und ich bemerkte, dass die Exception Nachrichten von Server zu Server ändern, so dass dies nicht zuverlässig ist.
uses adshlp, ActiveDs_TLB;
// 3 TEdit and a TButton
procedure TForm4.Button1Click(Sender: TObject);
Var
aUser : IAdsUser;
pDomain, pUser, pPassword : string;
myResult : HRESULT;
Counter: integer;
begin
pDomain := edtDomain.Text;
pUser:= edtUser.Text;
pPassword := edtPwd.Text;
Counter := GetTickCount;
Try
myResult := ADsOpenObject(Format('LDAP://%s',[pDomain]),Format('%s\%s',[pDomain,pUser]),pPassword,
ADS_READONLY_SERVER,
IAdsUser,aUser);
except
On E : EOleException do
begin
if (GetTickCount - Counter > 3000) then ShowMessage ('Problem with connection') else
if Pos('password',E.Message) > 0 then ShowMessage ('wrong username or password') else
if Pos('server',E.Message) > 0 then ShowMessage ('Connected') else
ShowMessage('Unhandled case');
memLog.Lines.Add(E.Message);
end;
end
end;
Der Grund, warum ich „Connected“, wenn die Meldung „Server“ gesetzt enthalten ist, dass auf meinen lokalen Rechnern (auf meinem Firma LDAP-Server in der Tat), falls alles in Ordnung ist (Domäne, Benutzer und Passwort) Der Server antwortet: "Der Server benötigt eine sicherere Authentifizierung", also ist das Wort "Server" dort, während in anderen Fällen "falscher Benutzer oder falsches Passwort" steht. Wenn dies auf itlianischen und englischen Servern funktionieren soll, setze ich "server" und "pasword" als zuverlässige Wörter. Jedenfalls habe ich auf einem anderen Server getestet, der verschiedene Fehler gibt.
Ich begann von einer Antwort auf this question, um das obige zu tun.
Wie kann ich überprüfen, ob der Benutzer mit einer ähnlichen Technik das richtige Passwort richtig eingegeben hat oder nicht?
UPDATE (gefunden Lösung)
Dank der Antworten gelang es mir, diese Funktion zu schreiben, die das tut, was ich brauche. Es scheint recht zuverlässig bis jetzt, ich schreibe hier zu teilen, in der Hoffnung es andere helfen kann:
// This function returns True if the provided parameters are correct
// login credentials for a user in the specified Domain
// From empirical tests it seems reliable
function UserCanLogin(aDomain, aUser, aPassword: string): Boolean;
var
hToken: THandle;
begin
Result := False;
if (LogonUser(pChar(aUser), pChar(aDomain), pChar(aPassword), LOGON32_LOGON_INTERACTIVE,
LOGON32_PROVIDER_DEFAULT, hToken)) then
begin
CloseHandle(hToken);
Result := True;
end;
end;
Danke, mit LogonUser konnte ich mein Ergebnis erreichen (ich aktualisiere jetzt meine Frage, um die einfache Funktion zu teilen, die ich schrieb). LogonUser löst keine Ausnahme wie ADsOpenObject. Ich habe meine Funktion auf 3 verschiedenen Servern (mit 3 verschiedenen Domänencontrollern) ausprobiert und es scheint zu funktionieren. – LaBracca
Morevoer die Lösung mit LogonUser ist einfacher als adshlp, ActiveDs_TLB wird nicht benötigt – LaBracca
Sie können 'SysErrorMessage (myResult)' anstelle von 'FormatMessage()' verwenden, die Sie den zugewiesenen Puffer sowieso nicht freigeben. Ehrlich gesagt verstehe ich diesen Teil der Antwort nicht. Wahrscheinlich habe ich die Frage falsch gelesen ... –