![]() |
Re: Angemeldeter Benutzer auslesen
Zitat:
|
Re: Angemeldeter Benutzer auslesen
Zitat:
|
Re: Angemeldeter Benutzer auslesen
Mit
![]() UPDATE: ![]()
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; |
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; |
Re: Angemeldeter Benutzer auslesen
Zitat:
Delphi-Quellcode:
Wenn Du jetzt trotzdem noch einen leeren String erhälst, dann schaue mal in Deinen Umgebungsvariablen nach, ob es dort die Variable USERNAME gibt.
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; |
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...
|
Re: Angemeldeter Benutzer auslesen
Zitat:
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. |
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.
|
Re: Angemeldeter Benutzer auslesen
Used this little test application:
Delphi-Quellcode:
System is Windows Vista x64 SP1. I will add a little trace later. Have to finish some work first.
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. |
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. |
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