![]() |
benutzername und passwort überprüfen
wie kann man das passwort zu einem benutzernamen überprüfen? sprich ich habe den benutzernamen und ein passwort und will rausfinden, ob das Passwort stimmt
wie geht das? (ohne logonUser, das geht bei mir wegen der rechte nicht...) |
Re: benutzername und passwort überprüfen
Wo speicherst du denn das Passwort, oder wie?
|
Re: benutzername und passwort überprüfen
das Passwort wird in einem edit eingegeben, ebenso wie der Benutzername
|
Re: benutzername und passwort überprüfen
Hi Illu,
wo und wie speicherst du die Datei ab? |
Re: benutzername und passwort überprüfen
ok, verständnisschwierigkeiten:
ich brauch das für ein netzwerk ich hab so einen kleinen "explorer" gefunden, den möcht ich dann unter einem anderen User starten, um auf dessen Dateien zugreifen zu können. Dazu muss ich aber den Benutzernamen und das Passwort einlesen und überprüfen! |
Re: benutzername und passwort überprüfen
Hallo,
versuchs mal so:
Delphi-Quellcode:
// Beispielaufruf var Res: THandle; bValid: Boolean; begin Res := Logon('Knut', '.', 'geheim', LOGON32_LOGON_INTERACTIVE); bValid := (Res <> INVALID_HANDLE_VALUE); if bValid then begin CloseHandle(Res); // Handle unbedingt wieder schließen!! ShowMessage('Logon erfolgreich'); else ShowMessage('Logon fehlgeschlagen'); end; // notwendige Methoden, Konstanten, Typen uses Windows; type TLogonRec = record U, D, P : PChar; Flag : Cardinal; Token : THandle; end; PrivFun = function(var UserData) : bool; const SE_CHANGE_NOTIFY_NAME = 'SeChangeNotifyPrivilege'; procedure PrivilegedExec(const Prv: string; Fun: PrivFun; var UserData); var Acc : THandle; NT : TTokenPrivileges; OT : ^TTokenPrivileges; i : Cardinal; begin if OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES, Acc) then begin // working on NT NT.PrivilegeCount := 1; NT.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED; LookupPrivilegeValue(nil, PChar(Pointer(Prv)), NT.Privileges[0].Luid); OT := nil; AdjustTokenPrivileges(Acc, false, NT, 0, OT^, i); try if not Fun(UserData) then RaiseLastOSError; finally AdjustTokenPrivileges(Acc, true, NT, 0, OT^, i); end; end else begin // working on W95/98 if not Fun(UserData) then RaiseLastOSError; end; end; function _Logon2(var Data) : Bool; begin with TLogonRec(Data) do Result := LogonUser(U, D, P, Flag, LOGON32_PROVIDER_DEFAULT, Token); end; function Logon(const User, Domain, Passw: string; Flag: Integer): THandle; var LR : TLogonRec; begin LR.U := PChar(User); LR.D := PChar(Domain); LR.P := PChar(Passw); LR.Flag := Flag; LR.Token := 0; PrivilegedExec(SE_CHANGE_NOTIFY_NAME, _Logon2, LR); Result := LR.Token; end; |
Re: benutzername und passwort überprüfen
sieht gut aus, aber ich bekomme immer 'logon erfolgreich', auch wenn ich das falsche Passwort eingebe!
|
Re: benutzername und passwort überprüfen
Hallo,
Domain und Passwort waren vertauscht:
Delphi-Quellcode:
Eventuell muss dem ausführenden Benutzer noch ein Recht gewährt werden:
Res := Logon(UserNm.Text, '.', PassWd.Text, LOGON32_LOGON_INTERACTIVE);
- secpol.msc ausführen - Lokale Sicherheitsrichtlinien / Zuweisen von Benutzerrechten - Erstellen eines Token-Objekts & Einsetzen als Teil des Betriebsystems für den "Passwort-Prüfer" aktivieren - danach neu anmelden |
Re: benutzername und passwort überprüfen
Zitat:
Zitat:
|
Re: benutzername und passwort überprüfen
wenn das Passwort stimmt, passts,
doch wenn es nicht stimmt exception "...Anmeldung fehlgeschagen: unbekannter Benutzername oder falsches Kennwort..." und zwar hier:
Delphi-Quellcode:
trotz des try-blocks bekomm ich die exception! Warum?
//Prozedur: PrivilegedExec
try if not Fun(UserData) then RaiseLastOSError; //<-- Hier finally AdjustTokenPrivileges(Acc, true, NT, 0, OT^, i); end; |
Re: benutzername und passwort überprüfen
ich habs irgendwie geschafft, dass das programm nicht mehr abbricht, aber wie kann man die exception unterdrücken :?:
|
Re: benutzername und passwort überprüfen
Hallo,
Du solltest
Delphi-Quellcode:
von
try
except // wird nur ausgeführt wenn ein Fehler auftritt // Exception wird abgefangen (falls kein raise innerhalb des Blocks steht) end
Delphi-Quellcode:
unterscheiden.
try
finally // wird immer (d.h. bei normalem Ablauf & im Fehlerfall) ausgeführt // aufgetretene Exceptions werden immer weitergereicht!! end So sollte es funtioniern:
Delphi-Quellcode:
// Beispielaufruf
var Res: THandle; bValid: Boolean; begin try Res := Logon('Knut', '.', 'geheim', LOGON32_LOGON_INTERACTIVE); except Res := INVALID_HANDLE_VALUE; end; bValid := (Res <> INVALID_HANDLE_VALUE); if bValid then begin CloseHandle(Res); // Handle unbedingt wieder schließen!! ShowMessage('Logon erfolgreich'); else ShowMessage('Logon fehlgeschlagen'); end; |
Re: benutzername und passwort überprüfen
RaiseLastOSError ist keine Exception, lediglich eine Ausgabe des letzten Systemfehlers für diesen Prozess! Das war sein Fehler.
|
Re: benutzername und passwort überprüfen
nun hab ich das RaiseLastOSError weggelassen, doch nun bleibt das programm stecken!
|
Re: benutzername und passwort überprüfen
Zitat:
Hast Du die Hinweise aus einem der Beiträge zuvor beachtet? Zitat:
|
Re: benutzername und passwort überprüfen
jup, das hab ich!
ich hab aber das Fun() auch weggelöscht, jetzt bleibt das Prog nicht mehr stecken! deshalb hab ich mir nun folgende funktion gemacht:
Delphi-Quellcode:
bekomm aber leider immer 'true' heraus, auch wenn das passwort nicht stimmt!
function rightPwd(Name, Pwrd: string): boolean;
var Res: THandle; bValid: Boolean; begin result := false; Res := Logon(Name, '.', Pwrd, LOGON32_LOGON_INTERACTIVE); bValid := (Res <> INVALID_HANDLE_VALUE); if bValid then begin CloseHandle(Res); // Handle unbedingt wieder schließen!! result := true; end; end; |
Re: benutzername und passwort überprüfen
Hallo,
Dir ist aber schon bewußt, dass
Delphi-Quellcode:
das Kernstück ist, oder?
if not Fun(UserData)
then RaiseLastOSError; Das muss unbedingt drinbleiben sonst ist der ganze Aufruf sinnlos! ändere bitte mal die Funktion Logon wie folgt ab:
Delphi-Quellcode:
function Logon(const User, Domain, Passw: string; Flag: Integer): THandle;
var LR : TLogonRec; begin LR.U := PChar(User); LR.D := PChar(Domain); LR.P := PChar(Passw); LR.Flag := Flag; LR.Token := INVALID_HANDLE_VALUE; // hier ändern !!! PrivilegedExec(SE_CHANGE_NOTIFY_NAME, _Logon2, LR); Result := LR.Token; end; |
Re: benutzername und passwort überprüfen
|
Re: benutzername und passwort überprüfen
@mr2: mit der änderung klappts!
thx! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:31 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz