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/)
-   -   Delphi Den angemeldeten User in Windows ermitteln (https://www.delphipraxis.net/90607-den-angemeldeten-user-windows-ermitteln.html)

RWarnecke 20. Apr 2007 13:43


Den angemeldeten User in Windows ermitteln
 
Hallo,

ich lasse ein Programm über eine Softwareverteilung mit dem User SYSTEM starten. Das funktioniert auch wunder bar. Ich habe nur ein Problem, im Programm benutze ich die folgende Funktion um den Usernamen zu ermitteln :
Delphi-Quellcode:
function GetCurrUserName: string;
var
  Size             : DWORD;
begin
  Size := MAX_COMPUTERNAME_LENGTH + 1;
  SetLength(Result, Size);
  if GetUserName(PChar(Result), Size) then
    SetLength(Result, Size)
  else
    Result := '';
end;
Nur leider liefert mir diese Funktion den Benutzernamen zurück, unter welchen ich das Programm ausführe. Also in meinem Fall SYSTEM. Gibt es noch einen anderen Weg um an den aktuell angemeldeten Benutzer zu kommen ?

Bernhard Geyer 20. Apr 2007 13:47

Re: Den angemeldeten User in Windows ermitteln
 
Muß denn überhaupt ein User angemeldet sein wenn diese Software-Verteilung läuft? Denn wenn keiner Angemeldet kann man auch nichts bestimmen. Dann könntest du nur schauen welche user schon mal lokal angemeldet waren.

RWarnecke 20. Apr 2007 13:50

Re: Den angemeldeten User in Windows ermitteln
 
Die Anwendung wird erst dann gestartet, wenn der User sich angemeldet hat, vorher nicht.

Luckie 20. Apr 2007 13:52

Re: Den angemeldeten User in Windows ermitteln
 
Na dann guck, ob du die interaktive Windowssession WinSta0 findest.

mkinzler 20. Apr 2007 14:01

Re: Den angemeldeten User in Windows ermitteln
 
Was sagr den die Umgebeungsvariable username?

RWarnecke 20. Apr 2007 15:22

Re: Den angemeldeten User in Windows ermitteln
 
Danke Leutz, ich habe mal wieder den Wald vor lauter Bäumen nicht gesehen. Ich habe es jetzt über die Variable USERNAME gelöst.

Dezipaitor 3. Mai 2007 11:23

Re: Den angemeldeten User in Windows ermitteln
 
Wie funktioniert denn das?

Die cmd Variable Username gibt den Name des derzeit eingeloggten Benutzers?
Als SystemDienst, wird doch da SYSTEM geliefert!?

Und was verstehst du unter eingeloggt? Ist jemand eingeloggt, wenn der direkt vor dem Bildschirm sitzt,
oder geht es auch, wenn jemand über ein Terminal (RDP) eingeloggt ist?

RWarnecke 3. Mai 2007 15:26

Re: Den angemeldeten User in Windows ermitteln
 
Zitat:

Zitat von Dezipaitor
Wie funktioniert denn das?

Wie funktioniert was ? Ich habe immer den Benutzer zum Anfang ausgelesen, welcher auch im Task-Manager steht. Nur das es dort vorkommen kann, dass dann auch mal als Benutzer System ausgespuckt wird. Beispiel, wenn eine Anwendung über eine Software-Verteilung mit erweiterten Systemrechten gestartet wird.
Zitat:

Zitat von Dezipaitor
Die cmd Variable Username gibt den Name des derzeit eingeloggten Benutzers?

Nach mein Wissen her ja. In der cmd Variable Username wird der aktuell eingeloggte Benutzername ausgegeben, der vor der Maschine sitzt.
Zitat:

Zitat von Dezipaitor
Als SystemDienst, wird doch da SYSTEM geliefert!?

Ja
Zitat:

Zitat von Dezipaitor
Und was verstehst du unter eingeloggt? Ist jemand eingeloggt, wenn der direkt vor dem Bildschirm sitzt,
oder geht es auch, wenn jemand über ein Terminal (RDP) eingeloggt ist?

Wie das mit RDP funktioniert weiß ich nicht. Für mein Programm war aber der User gemeint, der direkt gerade in diesem Augenblick vorm Rechner sitzt.

ralfiii 20. Mai 2020 09:43

AW: Den angemeldeten User in Windows ermitteln
 
Achtung. Der Code ist falsch.
Size sollte mit UNLEN + 1 = 256 + 1 initialisiert werden, nicht mit MAX_COMPUTERNAME_LENGTH + 1
Sonst schlägt das bei langen Usernamen fehl.

Assarbad 25. Mai 2020 20:13

AW: Re: Den angemeldeten User in Windows ermitteln
 
Zitat:

Zitat von RWarnecke (Beitrag 620486)
Zitat:

Zitat von Dezipaitor
Und was verstehst du unter eingeloggt? Ist jemand eingeloggt, wenn der direkt vor dem Bildschirm sitzt,
oder geht es auch, wenn jemand über ein Terminal (RDP) eingeloggt ist?

Wie das mit RDP funktioniert weiß ich nicht. Für mein Programm war aber der User gemeint, der direkt gerade in diesem Augenblick vorm Rechner sitzt.

Noch einen Löffel Senf von mir. Dezipaitor hat natürlich recht (und vor allem Ahnung von der Materie). Also geht es dir vermutlich um den interaktiven Benutzer in der Konsolensitzung. Wobei man sich mit Tricks auch aus der Ferne darauf verbinden kann (oder zumindest damals konnte).

Zwei Möglichkeiten:
  1. Registryschlüssel unterhalb HKEY_USERS auslesen, die bekannten SIDs ausfiltern und über die SID den Benutzernamen ermitteln (geht auch in Domänen und auch auf entfernten Rechnern, solange Registry-Fernzugriff aktiv, PsLoggedOn macht das so)
  2. Alternativ WTSEnumerateSessionsW und Freunde einsetzen.

Auch 2007 waren die NT-basierten Windowsversionen bereits multiuserfähig. Aber selbst dann war MSDN-Library durchsuchenGetUserName die bessere Wahl, da man sich bei Nutzung der Umgebungsvariablen darauf verlaßt, daß das entsprechende Benutzerprofil geladen wurde und diese Variablen enthält.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:11 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz