Delphi-PRAXiS
Seite 2 von 3     12 3      

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)

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:33 Uhr.
Seite 2 von 3     12 3      

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