Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Windows Login in eigener Applikation aufrufen (https://www.delphipraxis.net/169327-windows-login-eigener-applikation-aufrufen.html)

KNDelphi 12. Jul 2012 13:54

Windows Login in eigener Applikation aufrufen
 
Hey zusammen,

kenn jemand von euch eine Möglichkeit bzw. gibt es eine um den Windows-Login aufzurufen innerhalb meines Programms?

Folgendes: Ich möchte, dass sich ein Benutzer innerhalb meines Programms anmelden muss. Er soll ganz normal seinen Benutzername mit Passwort und die Domaine angeben.

Mir ist klar, dass ich das selbst implementieren könnte und mit LogonUser oder SSPI überprüfen kann, aber ich möchte, dass das Passwort nicht auszulesen ist. Mich interessiert lediglich der Benutzername und ob dieser ein gültiger Benutzer ist bzw. dieser sich mit den angegeben Daten im System einloggen kann.

Ich hoffe ihr versteht worauf ich hinaus will ;)

//Edit: Es soll nicht das Login des aktuell angemeldeten Users verwendet werden, da dies ein Gruppenlogin ist ;)

Greetz KNDelphi

tgvoelker 12. Jul 2012 14:23

AW: Windows Login in eigener Applikation aufrufen
 
Ja.

http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx

Mit CreateProcessWithLogonW authentifizierst Du am lokalen Rechner.

Wenn Du an einem Netzwerkrechner authentifizieren willst, dann kannst Du WNetAddConnection2 verwenden: http://msdn.microsoft.com/en-us/libr...3%28v=vs.85%29

Allerdings ist dann zu beachten, daß Du Dich nicht zweimal zum selben Netzwerkserver mit unterschiedlichen Anmeldenamen verbinden kannst (innerhalb einer Benutzersitzung). Wenn Du unterschiedliche Adressen nehmen kannst (IP-Adresse, Netbios-Name, FQDN), dann geht das trotzdem.

KNDelphi 12. Jul 2012 15:16

AW: Windows Login in eigener Applikation aufrufen
 
Danke für die schnelle Antwort :)

Versteh ich das richtig: Diese funktionen erwarten doch auch das Passwort als Parameter, d.h. ich muss es ja vorher abfragen?! Das ist ja genau das was ich nicht möchte...


KNDelphi

Jumpy 12. Jul 2012 15:31

AW: Windows Login in eigener Applikation aufrufen
 
Zitat:

Zitat von KNDelphi (Beitrag 1174489)
Versteh ich das richtig: Diese funktionen erwarten doch auch das Passwort als Parameter, d.h. ich muss es ja vorher abfragen?! Das ist ja genau das was ich nicht möchte...

Zitat:

Zitat von KNDelphi (Beitrag 1174462)
Folgendes: Ich möchte, dass sich ein Benutzer innerhalb meines Programms anmelden muss. Er soll ganz normal seinen Benutzername mit Passwort und die Domaine angeben.

Ja was den nun? Muss er es angeben oder nicht???
Irgendwie ist glaub ich doch nicht so ganz klar, was du willst.

KNDelphi 12. Jul 2012 15:37

AW: Windows Login in eigener Applikation aufrufen
 
Ja, natürlich muss er sein Passwort angeben, ohne geht es schlecht ;)

Ich möchte quasi eine Funktion die das ein Fenster öffnet in dem man Benutzername, Passwort und Domain eingibt (wie z.B. wenn man neue Hardware einsteckt, aber keine Rechte hat diese zu installieren -->http://kay-bruns.de/wp/wp-content/up...3/iathook0.png so etwas)
Und diese Funktion soll mir dann nur sagen ob der Login erfoglreich war und wenn ja, wie dieser Benutzer heisst.

Es geht darum dass der PC über ein Gruppenlogin startet, ich aber in meinem Programm wissen möchte wer in einem bestimmten Fenster etwas gemacht hat. Dazu soll einfach ein gültiges Login eingegeben und überprüft werden...

Nochmal: Es soll nirgends im Code möglich sein das Passwort auszulesen!

Ich hoffe jetzt ist es etwas deutlicher geworden ;)

KNDelphi

p80286 12. Jul 2012 15:44

AW: Windows Login in eigener Applikation aufrufen
 
Zitat:

Zitat von KNDelphi (Beitrag 1174489)
Danke für die schnelle Antwort :)

Versteh ich das richtig: Diese funktionen erwarten doch auch das Passwort als Parameter, d.h. ich muss es ja vorher abfragen?! Das ist ja genau das was ich nicht möchte...


KNDelphi

Dann besorg Dir eine Liste der gültigen Benutzer/Domänen und mach den etsprechenden Abgleich.
Oder geh gleich über LDAP.

Gruß
K-H

Jumpy 12. Jul 2012 16:23

AW: Windows Login in eigener Applikation aufrufen
 
Hier mal sowas, dass mir erst vor kurzem hier gezeigt wurde, Domäne ist immer fix, d.h. muss/kann bei mir nicht angegeben werden:

Delphi-Quellcode:
//User ist eine globale Variable in der Klasse, in der ich den Usernamen speichere.

procedure TMain.acErweitertExecute(Sender: TObject);
var u,p:String;
begin
  u:=User;
  p:='';
  if RemoteLoginDialog(u,p) then
    begin
    if CheckUserAccount(u,p,'UnsreDomäne') then
      begin
      User:=u
    else
      showmessage('Falscher Benutzername oder falsches Passwort!');
    end;
end;

function TMain.CheckUserAccount(Username, Password, Domain : string) : boolean;
var token: THandle;
begin
  if LogonUser(PChar(Username), PChar(Domain), PChar(Password),
    LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, Token) then
  begin
    CloseHandle(Token);
    Result := Token <> 0;
  end else
    Result := False;
end;

generic 12. Jul 2012 16:31

AW: Windows Login in eigener Applikation aufrufen
 
Zitat:

Zitat von KNDelphi (Beitrag 1174499)
Und diese Funktion soll mir dann nur sagen ob der Login erfoglreich war und wenn ja, wie dieser Benutzer heisst.

Login erfolgreich = User kann Progamm in seinen Konto starten - sonst wäre er ja nicht am PC angemeldet.
Wie der User heißt = GetUserName

Dalai 12. Jul 2012 22:59

AW: Windows Login in eigener Applikation aufrufen
 
Wie wär's mit ShellExecuteEx mit dem Verb 'runas' (UAC ab Vista) bzw. 'runasuser' (ab Vista nötig, um den von XP gewohnten 'Ausführen als'-Dialog aufzurufen)? Ich hatte so ein ähnliches Problem vor ein paar Monaten und hab das in diesem Thread diskutiert.

MfG Dalai

Furtbichler 13. Jul 2012 04:54

AW: Windows Login in eigener Applikation aufrufen
 
Ich glaub, er will 'einfach nur' eine Funktion, wie z.B.

Delphi-Quellcode:
If ShowLoginDialogAndAskForUserNameAndPasswordAndReturnTheUserName(userName) then begin
  ShowMessage('You are '+userName);
  If IsAllowedToDoWhatever (userName) then
    DoWhatever();
end;
Und die Funktion mit dem ziemlich langen Namen soll eben halt nicht war von Windows direkt kommen weil man ja das Passwort nirgens im Code auslesen können soll.

Das soll dann wohl obersichermäßig sein.

:stupid:

KNDelphi 13. Jul 2012 06:49

AW: Windows Login in eigener Applikation aufrufen
 
Danke an alle, ich komm der Sache schon langsam näher ;)

@Dalai
Wie sieht denn der Aufruf von ShellExecuteEx bzw. das ShellExecuteInfo aus?

Ich habe es jetzt mal mit dem normalen ShellExecute gemacht, das funktioniert soweit auch, allerdings kann ich hier den Benutzernamen nicht auslesen oder etwa doch?!

MfG

KNDelphi

jobo 13. Jul 2012 07:11

AW: Windows Login in eigener Applikation aufrufen
 
Wenn Du zu Fuß
Code:
runas /user:[user]
durchführst, kannst du über set die Umgebungsvariablen anzeigen. Da findest Du z.B. USERNAME, USERDOMAIN usw.
Das müsste auch per WinAPI Code
Code:
GetEnvironmentVariable
gehen.

KNDelphi 13. Jul 2012 08:18

AW: Windows Login in eigener Applikation aufrufen
 
Leider ist bis jetzt nicht wirklich das dabei was ich gesucht habe...
Ich befürchte, dass es soetwas gar nicht gibt :D

Trotzdem vielen Dank für eure Hilfe ;)

MfG
KNDelphi

Luckie 13. Jul 2012 09:57

AW: Windows Login in eigener Applikation aufrufen
 
http://michael-puff.de/Programmierun...dentials.shtml

Und überprüfen ob die Eingaben zu einem Benutzerkonto gehören kannst du mit der Unit http://michael-puff.de/Programmierung/Delphi/Units -> SSPIValidatePassword.pas

CCRDude 13. Jul 2012 10:09

AW: Windows Login in eigener Applikation aufrufen
 
Sowohl bei Jumpy als auch Luckies erstem Link sei noch empfohlen, ein ZeroMemory (bzw. ich glaube da gibt es noch eine Extra-Version für Passwörter?) nach dem Aufruf und der Verarbeitung einzubauen. Nach dem Funktion-Verlassen bzw. dem FreeMem kann das Passwort ja sonst immer noch im Speicher stehen (man sollte sich da auch nicht auf empirisches Compilerwissen verlassen), und genau deshalb sollte man auch sparsam mit der Verwendung so wichtiger Passwörter sein ;)

Jumpy 13. Jul 2012 10:23

AW: Windows Login in eigener Applikation aufrufen
 
OK, beim x-ten mal durchlesen und nach Furtbichlers Kommentar hab ich es glaub ich auch verstanden. Es geht darum, dass Passwort sogar vor dem Programmierer zu verstecken, sprich er soll keine Möglichkeit haben, das in einer Variable zu speichern und an anderer Stelle weiterzuverwenden oder sich nach Hause zu schicken.

Selbst wenn es eine Methode/Komponente/was weiß ich gäbe, die das könnte, wer garantiert dafür, dass die nicht auch schon ein Hintertürchen eingebaut hat? Hier passt glaub ich der Spruch: "Irgendeinen Tod muss man sterben" bzw. abgewandelt: "Irgendwann muss man mal jemandem Vertrauen".

Oder der Kunde, der das haben will, kann ja sich selber ausdenken wie das geht, das in eine .dll packen und diese zur Verfügung stellen. Dann weiß er sicher was mit seinen Passworten passiert. Sicher???

Klaus01 13. Jul 2012 10:32

AW: Windows Login in eigener Applikation aufrufen
 
.. wenn ich das richtig verstanden habe, dann macht das auch nur Sinn
wenn User-X im Windows-System abgemeldet ist und als User-Y die Applikation starten soll. User-Y soll dann authentifiiziert werden.

Wenn User-X die Applaktion nutzen soll, dann muss doch die Applikation überprüfen
wer im System angemeldet ist (User-X) und ob dieser User berechtigt ist die Applikation zu nutzen.

Grüße
Klaus

KNDelphi 13. Jul 2012 10:51

AW: Windows Login in eigener Applikation aufrufen
 
@Luckie
Das ist schon fast das was ich gesucht habe :)
Nur muss ich hier ebenfalls das Passwort kurz speichern, aber ich werde diese Lösung jetzt implementieren ;)

@Jumpy
Danke für den Hinweis ;)

@Klaus
Es geht mir nicht um Berechtigungen, ich möchte lediglich den Namen einer Person speichern, die innerhalb des Programms eine bestimmte Aktion ausführen. Der Name soll aber nicht beliebeig eingegeben werden sondern ein gültiges Windows-Login sein, da es um wichtige Daten geht.

MfG

Dalai 13. Jul 2012 15:01

AW: Windows Login in eigener Applikation aufrufen
 
Zitat:

Zitat von KNDelphi (Beitrag 1174557)
@Dalai
Wie sieht denn der Aufruf von ShellExecuteEx bzw. das ShellExecuteInfo aus?

Ziemlich einfach:
Delphi-Quellcode:
function TMainForm.RunAs(const verb: string): Boolean;
var sei: TShellExecuteInfo;
begin
    FillChar(sei, SizeOf(sei), 0);
    sei.cbSize:= SizeOf(sei);
    sei.Wnd:= Self.Handle;
    sei.fMask:= SEE_MASK_FLAG_DDEWAIT (*OR SEE_MASK_FLAG_NO_UI OR SEE_MASK_NOCLOSEPROCESS*);
    sei.lpVerb:= PChar(verb);
    sei.lpFile:= PChar(Application.ExeName);
    sei.lpParameters:= PChar('runas ' + IntToStr(Self.Handle));
    sei.nShow:= SW_SHOWNORMAL;
    Result:= ShellExecuteEx(@sei);
end;
Als Verb kommt entweder 'runas' (bis einschließlich XP) oder 'runasuser' (ab Vista) rein.

Zitat:

allerdings kann ich hier den Benutzernamen nicht auslesen oder etwa doch?!
Den Benutzernamen kannst du mit ShellExecute(Ex) überhaupt nicht auslesen. ShellExecute(Ex) führt Programme aus. Das können andere Programme sein oder wie im Beispiel oben das eigene Programm oder auch (mit einem Programm verknüpfte) Dokumente/Dateitypen. Wenn man das Verb 'runas' oder 'runasuser' verwendet, so kann man die Ausführung mit einem anderen Nutzer erledigen lassen.

Aber ich denke, ich sehe jetzt, dass du in eine andere Richtung willst/musst, weshalb dir ShellExecuteEx nicht weiterhelfen dürfte.

MfG Dalai


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:57 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