![]() |
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 |
Re: Angemeldeter Benutzer auslesen
Systemvariable USERNAME
|
Re: Angemeldeter Benutzer auslesen
Darf man fragen wozu Du das benötigst?
|
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) |
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:
Gibts da keine Möglichkeit? |
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. |
Re: Angemeldeter Benutzer auslesen
hi luckie, gute Frage. Ich meinte den Benutzer der vor dem Bildschirm sitzt! ;-)
geht das? |
Re: Angemeldeter Benutzer auslesen
[OT]
Zitat:
[/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 |
Re: Angemeldeter Benutzer auslesen
Zitat:
|
Re: Angemeldeter Benutzer auslesen
Zitat:
Delphi-Quellcode:
Der Code ist nicht von mir, aber k.A. woher ich den habe.
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; |
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. |
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:
|
Re: Angemeldeter Benutzer auslesen
A second crash occurs within DiffTimeString within the unit JwaWinSta when calling ElapsedTimeStringSafe.
|
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 ;).
|
Re: Angemeldeter Benutzer auslesen
hey super! mit diesem Code von wido hats bei mir prima geklappt!
Delphi-Quellcode:
Vielen Dank euch allen! :thumb:
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. 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 ;-) ![]() |
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