Entwickler-Ecke

Windows API - Windows-Loginpasswort nutzen


MarkusBauer - Fr 29.08.08 20:32
Titel: Windows-Loginpasswort nutzen
Hallo,

gibt es unter Delphi irgenteine Funktion, mit der man ein eingegebenes Windows-Benutzerpasswort überprüfen kann?
Hab im Forum nix gefunden und Google spuckt nur Ergebnisse in C aus.
Hat irgentjemand eine Idee?

lg Markus


mkinzler - Fr 29.08.08 20:34

Die Windows-Api kann man auch aus Delphi heraus aufrufen


Chryzler - Fr 29.08.08 21:39

Geht mit der SSPIValidatePassword.pas [http://www.michael-puff.de/Developer/Delphi/Units/SSPIValidatePassword.pas] von user profile iconLuckie.


MarkusBauer - So 31.08.08 18:14

Bei mir funktioniert die Unit leider nicht richtig, egal welche Argumente ich an die Funktion übergebe (gültige/ungültige Domain, (nicht) existierender Nutzer, richtiges oder falsches Passwort), ich erhalte immer den Wert true zurück. Ich verwende XP SP2 und Delphi 7 PE.



Wegen der API: Ich weiß leider nicht wie man diese Apifunktionen in Delphi aufrufen kann. Wenn jemand helfen könnte, hier die Seite mit dem C-Code: http://dotnet-snippets.de/dns/windows-passwort-ueberpruefen-uebersetzung-SID861.aspx


Chryzler - So 31.08.08 19:31


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
type
  function LogonUser(lpszUsername: String; lpszDomain: String; lpszPassword: String; dwLogonType: Integer; dwLogonProvider: Integer; var phToken: Integer): Integer; external 'advapi32.dll';

function IsNTPasswordValid(Username: String; Password: String; Domain: String): Boolean;
var
  token: Integer;
begin
  LogonUser(Username, Domain, Password, 20, token);
  CloseHandle(token);
  Result := token != 0;
end;

Ungetestet.
user profile iconMarkusBauer hat folgendes geschrieben:
Bei mir funktioniert die Unit leider nicht richtig, egal welche Argumente ich an die Funktion übergebe (gültige/ungültige Domain, (nicht) existierender Nutzer, richtiges oder falsches Passwort), ich erhalte immer den Wert true zurück. Ich verwende XP SP2 und Delhpi 7 PE.

Liegt glaube ich daran, dass man zuerst einen bestimmten Registryschlüssel ändern muss, damit die Funktion erfolgreich funktioniert. Kann ihn nur grad nicht finden.

EDIT: Nein! :P


alias5000 - So 31.08.08 19:57

user profile iconChryzler hat folgendes geschrieben:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
type
  function LogonUser(lpszUsername: String; lpszDomain: String; lpszPassword: String; dwLogonType: Integer; dwLogonProvider: Integer; var phToken: Integer): Integer; external 'advapi32.dll';

function IsNTPasswordValid(Username: String; Password: String; Domain: String): Boolean;
var
  token: Integer;
begin
  LogonUser(Username, Domain, Password, 20, token);
  CloseHandle(token);
  Result := token <> 0;  // != wäre ja C# ;)
end;

Wie gut kenne ich das :lol:


Hidden - So 31.08.08 20:06

Hi,

Mal was ganz anderes: Ich würde niemals einem Programm soweit vertrauen, dass ich ihm meine Login-Daten überlasse und darauf vertraue, dass diese nur zur Bestätigung verwendet werden. Noch nichtmal, wenn das Programm zertifiziert ist ;)

mfG,


Dezipaitor - So 31.08.08 23:33

Hier sollten die Logindaten ,übergeben über die Parameter, mit "Const" deklariert werden, da sonst eine (unverschlüsselte) Kopie der Daten im Speicher übrigbleibt.

@Hidden: Schon richtig! Hast du mal RunAs oder so verwendet? Da gibt man seine Daten auch an. Das ist natürlich nicht sicher.
Daher soll man sein Passwort auch immer nur im sicheren LogonDesktop "Winlogon" ändern. Mit etwas Aufwand können das auch andere, selbstgemachte Programme. Dies erfordert jedoch eine Installation als Dienst.