Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Angemeldeter Benutzer auslesen (https://www.delphipraxis.net/111201-angemeldeter-benutzer-auslesen.html)

cherry 31. Mär 2008 14:56


Angemeldeter Benutzer auslesen
 
hi @ all

Progge grade einen Service... möchte jetzt den aktuellen Benutzer (Der Benutzer der momentan am PC angemeldet ist und damit arbeitet) auslesen. Wenn ich das auf die herkömmliche Methode GetUser mache, erhalte ich natürlich 'SYSTEM' weil der Dienst ja als solchen gestartet wurde...

Wie kriege ich den Benutzername des angemeldeten Benutzers also?

hab schon mal was ähnliches gefragt und da hat jmd gemeint, dass es vielleicht mit "JEDI API LIB & Windows Security Code Library (JWSCL) " gehen würde...

Das ist schon mal eine Spur, aber welche Funktion welcher Unit von JWSCL muss ich Wie Benutzer um das anzustellen...
Kenn mich mit JWSCL überhaupt nicht aus, also wäre ich dankbar wenn ihr mir helfen könnt. Oder gehts noch einfacher?

Liebe Grüsse

RWarnecke 31. Mär 2008 15:00

Re: Angemeldeter Benutzer auslesen
 
Systemvariable USERNAME

wido 31. Mär 2008 15:03

Re: Angemeldeter Benutzer auslesen
 
Darf man fragen wozu Du das benötigst?

cherry 31. Mär 2008 15:04

Re: Angemeldeter Benutzer auslesen
 
LOOOOOOOOOOOOOOL! :oops:
ich sollte wohl besser nach hause gehen, ist wohl nicht mein Tag heute!

Vielen Dank

(Kann mal jmd diesen Thread wieder entfernen?! - Ist ja sinnlos)

cherry 31. Mär 2008 15:30

Re: Angemeldeter Benutzer auslesen
 
Halt mal... das mit GetEnvironmentVariable('USERNAME'); geht doch nicht, ich erhalte einen leeren String! wo ist denn da das Problem?

Zitat:

Darf man fragen wozu Du das benötigst?
Ich erstelle in eine MSSQL DB einträge für den Benutzer, also muss ich irgendwie herausfinden welcher Benutzer angemeldet ist!

Gibts da keine Möglichkeit?

Luckie 31. Mär 2008 15:33

Re: Angemeldeter Benutzer auslesen
 
Welchen Benutzer hättest du denn gerne? Der, der vor dem Bildschrim sitzt; der, der sich per Remotdeskop angemeldet hat oder den der sich gerade per FastUserSwitching angemeldet hat? Ganz abgesehen mal von den Benutzern, die sich per Terminalsession an dem Rechner angemeldet haben.

Es gibt nicht "den" angemeldeten Benutzer.

cherry 31. Mär 2008 16:34

Re: Angemeldeter Benutzer auslesen
 
hi luckie, gute Frage. Ich meinte den Benutzer der vor dem Bildschirm sitzt! ;-)
geht das?

Fussball-Robby 31. Mär 2008 16:39

Re: Angemeldeter Benutzer auslesen
 
[OT]
Zitat:

Zitat von cherry
hi luckie, gute Frage. Ich meinte den Benutzer der vor dem Bildschirm sitzt! ;-)
geht das?

Über WebCam Gesicht scannen, Fingerabdruck nehmen und DNA überprüfen :mrgreen:
[/OT]
Ich denke, Michael wollte damit sagen, dass es schwierig bzw. umständlich ist, den aktuellen Benutzer auszulesen, da es viele Wege gibt, sich anzumelden/den PC zu steuern.

Mfg

Luckie 31. Mär 2008 16:46

Re: Angemeldeter Benutzer auslesen
 
Zitat:

Zitat von Fussball-Robby
Ich denke, Michael wollte damit sagen, dass es schwierig bzw. umständlich ist, den aktuellen Benutzer auszulesen, da es viele Wege gibt, sich anzumelden/den PC zu steuern.

Nein, nicht schwierig oder umständlich, sondern unmöglich, denn wie gesagt, wer ist denn der aktuelle Benutzer, der für deine Datenbank relevant ist? Ermittelst du den Benutzer der vor dem Rechner an der Tastatur sitz, was machst du mit dem Benutzer, der per Remotedesktop oder per Terminalsession deine Anwendung benutzt?

Popov 31. Mär 2008 16:52

Re: Angemeldeter Benutzer auslesen
 
Zitat:

Zitat von cherry
hi luckie, gute Frage. Ich meinte den Benutzer der vor dem Bildschirm sitzt! ;-)
geht das?

Delphi-Quellcode:
function GetCurrentUserName: string;
const
  cnMaxUserNameLen = 254;
var
  sUserName: string;
  dwUserNameLen: DWORD;
begin
  dwUserNameLen := cnMaxUserNameLen - 1;
  SetLength(sUserName, cnMaxUserNameLen);
  GetUserName(PChar(sUserName), dwUserNameLen);
  SetLength(sUserName, dwUserNameLen);
  Result := sUserName;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(GetCurrentUserName);
end;
Der Code ist nicht von mir, aber k.A. woher ich den habe.

Luckie 31. Mär 2008 17:00

Re: Angemeldeter Benutzer auslesen
 
Zitat:

Zitat von Popov
Zitat:

Zitat von cherry
hi luckie, gute Frage. Ich meinte den Benutzer der vor dem Bildschirm sitzt! ;-)
geht das?

Delphi-Quellcode:
function GetCurrentUserName: string;
const
  cnMaxUserNameLen = 254;
var
  sUserName: string;
  dwUserNameLen: DWORD;
begin
  dwUserNameLen := cnMaxUserNameLen - 1;
  SetLength(sUserName, cnMaxUserNameLen);
  GetUserName(PChar(sUserName), dwUserNameLen);
  SetLength(sUserName, dwUserNameLen);
  Result := sUserName;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(GetCurrentUserName);
end;
Der Code ist nicht von mir, aber k.A. woher ich den habe.

Rat mal, was der bei einem Dienst zurückgibt? Dass das nicht funktioniert wurde übrigens schon festgestellt.

Popov 31. Mär 2008 17:07

Re: Angemeldeter Benutzer auslesen
 
Zitat:

Zitat:

Zitat von Luckie
Der Code ist nicht von mir, aber k.A. woher ich den habe.

Rat mal, was der bei einem Dienst zurückgibt? Dass das nicht funktioniert wurde übrigens schon festgestellt.
Sorry, hab nur den Titel gelesen und den Code gerade parat gehabt. Vielleicht sollte man den Titel erweitern.

Dezipaitor 31. Mär 2008 17:26

Re: Angemeldeter Benutzer auslesen
 
Mit JWSCL geht es so.

UPDATE: http://blog.delphi-jedi.net/2008/03/...rom-a-service/

Delphi-Quellcode:
uses
  JwaWindows,
  JwsclToken,
  JwsclSid,
  JwsclStrings,
  SysUtils;

var
  UserToken : TJwSecurityToken;
  ConsoleUser : TJwSecurityId;
  UserSidString,
  UserName : TJwString;
begin
  //erst ab Windows XP
  UserToken := TJwSecurityToken.CreateWTSQueryUserToken(INVALID_HANDLE_VALUE);
  try
    ConsoleUser := UserToken.TokenUser;
    try
      UserSidString := ConsoleUser.StringSID;
      UserName := ConsoleUser.GetAccountName('');
      //Writeln(UserSidString);
      //Writeln(UserName);
    finally
      FreeAndNil(ConsoleUser);
    end;
    //User personifizieren
    UserToken.ImpersonateLoggedOnUser;
   
    Führe Funktionen im Kontext des Benutzers aus
    z.B. WinAPI GetUserName(...), GetShellFolder, usw.
Auch Zugriff auf Dateien und Registry laufen dann in diesem Kontext. CreateProcess funktioniert jedoch nicht damit.
   
    UserToken.RevertToSelf;

  finally
    FreeAndNil(UserToken);
  end;
end;

Remko 31. Mär 2008 21:19

Re: Angemeldeter Benutzer auslesen
 
Use the WTSGetActiveConsoleSessionId function to obtain the SessionId of the console session, then use WTSQuerySessionInformation with the WTSUserName parameter to obtain the username.

Or using the Terminal Server unit of the Security Library (JwsclTerminalServer):

Delphi-Quellcode:
uses JwaWindows, JwsclTerminalServer;

var
  TS: TJwTerminalServer;
  Session: TJwWTSSession;

begin
  TS := TJwTerminalServer.Create;

  if TS.EnumerateSessions then
  begin
    Session := ts.FindBySessionId(WTSGetActiveConsoleSessionId);

    if Session <> nil then
    begin
      Memo1.Lines.Add(Session.Username);
    end;

  end;

  TS.Free;
end;

RWarnecke 31. Mär 2008 21:34

Re: Angemeldeter Benutzer auslesen
 
Zitat:

Zitat von cherry
Halt mal... das mit GetEnvironmentVariable('USERNAME'); geht doch nicht, ich erhalte einen leeren String! wo ist denn da das Problem?

Also ich nehme immer diese Funktion die ich mal gefunden habe, funktioniert wunderbar.
Delphi-Quellcode:
function GetEnvVarValue(const VarName: string): string;
var
  BufSize: Integer; // buffer size required for value
begin
  // Get required buffer size (inc. terminal #0)
  BufSize := GetEnvironmentVariable(PChar(VarName), nil, 0);
  if BufSize > 0 then
  begin
    // Read env var value into result string
    SetLength(Result, BufSize - 1);
    GetEnvironmentVariable(PChar(VarName),
      PChar(Result), BufSize);
  end
  else
    // No such environment variable
    Result := '';
end;
Wenn Du jetzt trotzdem noch einen leeren String erhälst, dann schaue mal in Deinen Umgebungsvariablen nach, ob es dort die Variable USERNAME gibt.

Remko 31. Mär 2008 21:36

Re: Angemeldeter Benutzer auslesen
 
Reading an env variable will read from the current user's environment (in this case SYSTEM). In this case the user of the interactive console session is asked...

wido 31. Mär 2008 21:38

Re: Angemeldeter Benutzer auslesen
 
Zitat:

Zitat von RWarnecke
Wenn Du jetzt trotzdem noch einen leeren String erhälst, dann schaue mal in Deinen Umgebungsvariablen nach, ob es dort die Variable USERNAME gibt.

Er will den Usernamen von einem Service aus ermitteln. Der Service läuft aber in einem komplett anderen Kontext als der User und sieht daher die Umgebungsvariablen des Users nicht.

Als kleiner Hinweis noch:
JwsclTerminalServer hat ein Problem unter Vista SP1 beim Aufruf der EnumerateSessions Methode. Ist also nur bedingt zu gebrauchen. Hatte für den Thread Ersteller eigentlich gedacht ihm nen ähnlichen Code zu geben und habs verworfen, als die kleine Demo unter SP1 permanent gecrashed ist.

Remko 31. Mär 2008 21:41

Re: Angemeldeter Benutzer auslesen
 
It works for me under SP1 (English) but please tell if anything and what goes wrong (I am the author of JwsclTerminalServer) so we can fix it.

wido 31. Mär 2008 21:51

Re: Angemeldeter Benutzer auslesen
 
Used this little test application:

Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}

uses
  JwsclTerminalServer;

var
  TS : TJwTerminalServer;
  i : integer;
begin
  TS := TJwTerminalServer.Create;
  TS.Connect;
  TS.EnumerateSessions; // Crash

  for i := 0 to TS.Sessions.Count - 1 do
    writeln(TS.Sessions[i].Username);
  TS.Free;
end.
System is Windows Vista x64 SP1. I will add a little trace later. Have to finish some work first.

Dezipaitor 31. Mär 2008 22:33

Re: Angemeldeter Benutzer auslesen
 
Du verwendest 64bit Vista. Das hat hier so gut wie niemand :D
Daher wird es bei anderen garnicht crashen können.

wido 31. Mär 2008 22:34

Re: Angemeldeter Benutzer auslesen
 
Ok, I did a little bit of testing. The crash occurs in DateTimeStringSafe within the JwaWinSta unit. The problem is the DateTimeStringVista call. I am not that good at reversing but in my opinion DateTimeString inside the utildll.dll doesn't take 3 parameters on Vista SP1. I might be wrong though.

Zitat:

Zitat von Dezipaitor
Du verwendest 64bit Vista. Das hat hier so gut wie niemand :D
Daher wird es bei anderen garnicht crashen können.

Naja, stell meinen Rechner gerne zur Verfügung :P.

wido 31. Mär 2008 22:47

Re: Angemeldeter Benutzer auslesen
 
A second crash occurs within DiffTimeString within the unit JwaWinSta when calling ElapsedTimeStringSafe.

wido 31. Mär 2008 23:38

Re: Angemeldeter Benutzer auslesen
 
Gut, mit der aktuellen JEDI API und JWSCL Version aus dem SVN kann man JwsclTerminalServer jetzt auch problemlos unter Vista SP1 benutzen ;).

cherry 1. Apr 2008 08:08

Re: Angemeldeter Benutzer auslesen
 
hey super! mit diesem Code von wido hats bei mir prima geklappt!

Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE} 

uses
  JwsclTerminalServer;

var
  TS : TJwTerminalServer;
  i : integer;
begin
  TS := TJwTerminalServer.Create;
  TS.Connect;
  TS.EnumerateSessions; // Crash

  for i := 0 to TS.Sessions.Count - 1 do
    writeln(TS.Sessions[i].Username);
  TS.Free;
end.
Vielen Dank euch allen! :thumb:

PS: In einem alten Thread von mir geht es nun darum einen Benutzer der auf diese weise ausgelesen wird abzumelden...
vielleicht könnte mal jemand einen Blick drauf werfen ;-)

http://www.delphipraxis.net/internal...952&highlight=

Remko 1. Apr 2008 10:29

Re: Angemeldeter Benutzer auslesen
 
Use TS.Sessions[i].Logoff

Maybe you should read the documentation...

procedure Logoff(bWait: Boolean);
The Logoff function logs off a specified Terminal Services session


Parameters
bWait
Indicates whether the operation is synchronous. Specify TRUE to wait for the operation to complete, or FALSE to return immediately.
Exceptions raised
EJwsclWinCallFailedException
will be raised if the call fails.


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