Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi benutzername und passwort überprüfen (https://www.delphipraxis.net/11619-benutzername-und-passwort-ueberpruefen.html)

Illuminator-23-5 10. Nov 2003 17:32


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...)

Matze 10. Nov 2003 17:34

Re: benutzername und passwort überprüfen
 
Wo speicherst du denn das Passwort, oder wie?

Illuminator-23-5 10. Nov 2003 17:43

Re: benutzername und passwort überprüfen
 
das Passwort wird in einem edit eingegeben, ebenso wie der Benutzername

Die Muhkuh 10. Nov 2003 18:16

Re: benutzername und passwort überprüfen
 
Hi Illu,


wo und wie speicherst du die Datei ab?

Illuminator-23-5 10. Nov 2003 18:22

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!

mr2 10. Nov 2003 18:37

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;

Illuminator-23-5 10. Nov 2003 18:42

Re: benutzername und passwort überprüfen
 
sieht gut aus, aber ich bekomme immer 'logon erfolgreich', auch wenn ich das falsche Passwort eingebe!

mr2 10. Nov 2003 18:58

Re: benutzername und passwort überprüfen
 
Hallo,

Domain und Passwort waren vertauscht:
Delphi-Quellcode:
  Res := Logon(UserNm.Text, '.', PassWd.Text, LOGON32_LOGON_INTERACTIVE);
Eventuell muss dem ausführenden Benutzer noch ein Recht gewährt werden:

- 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

Matze 10. Nov 2003 19:17

Re: benutzername und passwort überprüfen
 
Zitat:

Zitat von Matze
Wo speicherst du denn das Passwort, oder wie?

Zitat:

Zitat von Spider
wo und wie speicherst du die Datei ab?

irgendwie das selbe. :mrgreen:

Illuminator-23-5 12. Nov 2003 13:33

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:
//Prozedur: PrivilegedExec
    try
      if not Fun(UserData)
      then RaiseLastOSError;  //<-- Hier
    finally
      AdjustTokenPrivileges(Acc, true, NT, 0, OT^, i);
    end;
trotz des try-blocks bekomm ich die exception! Warum?

Illuminator-23-5 12. Nov 2003 15:52

Re: benutzername und passwort überprüfen
 
ich habs irgendwie geschafft, dass das programm nicht mehr abbricht, aber wie kann man die exception unterdrücken :?:

mr2 12. Nov 2003 19:09

Re: benutzername und passwort überprüfen
 
Hallo,

Du solltest
Delphi-Quellcode:
try

except
// wird nur ausgeführt wenn ein Fehler auftritt
// Exception wird abgefangen (falls kein raise innerhalb des Blocks steht)
end
von
Delphi-Quellcode:
try

finally
// wird immer (d.h. bei normalem Ablauf & im Fehlerfall) ausgeführt
// aufgetretene Exceptions werden immer weitergereicht!!
end
unterscheiden.

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;

Luckie 12. Nov 2003 19:15

Re: benutzername und passwort überprüfen
 
RaiseLastOSError ist keine Exception, lediglich eine Ausgabe des letzten Systemfehlers für diesen Prozess! Das war sein Fehler.

Illuminator-23-5 13. Nov 2003 16:20

Re: benutzername und passwort überprüfen
 
nun hab ich das RaiseLastOSError weggelassen, doch nun bleibt das programm stecken!

mr2 13. Nov 2003 18:32

Re: benutzername und passwort überprüfen
 
Zitat:

RaiseLastOSError löst eine Exception für den letzten Fehler im Betriebssystem oder in der Systembibliothek aus.
Also bei mir funktioniert das zuletzt angegebene Beispiel (MIT RaiseLastOSError) einwandfrei.
Hast Du die Hinweise aus einem der Beiträge zuvor beachtet?
Zitat:

Eventuell muss dem ausführenden Benutzer noch ein Recht gewährt werden:

- 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

Illuminator-23-5 14. Nov 2003 14:06

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:
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;
bekomm aber leider immer 'true' heraus, auch wenn das passwort nicht stimmt!

mr2 14. Nov 2003 19:46

Re: benutzername und passwort überprüfen
 
Hallo,

Dir ist aber schon bewußt, dass
Delphi-Quellcode:
  if not Fun(UserData)
  then RaiseLastOSError;
das Kernstück ist, oder?
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;

DaFox 14. Nov 2003 20:25

Re: benutzername und passwort überprüfen
 
Hi,

http://support.microsoft.com:80/supp...NoWebContent=1

Gruß,
Markus

Illuminator-23-5 15. Nov 2003 10:59

Re: benutzername und passwort überprüfen
 
@mr2: mit der änderung klappts!
thx!


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:57 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz