Autor Beitrag
AScomp
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 162


Delphi 5, Delphi 7, Delphi 2007, Delphi 2009, Delphi XE, Delphi 10 Seattle
BeitragVerfasst: Do 07.01.10 08:17 
Guten Morgen,

mit der API-Funktion GetUserName ermittle ich bisher den Namen des Benutzers:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
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;


Sobald das Programm mit Administratorrechten auf einem Standardbenutzer gestartet wird (Vista/7), gibt die Funktion allerdings den Namen des Administrators zurück, unter dem das Programm gestartet wurde. Ich würde allerdings gerne ermitteln, wie der Benutzer heißt, der aktuell angemeldet ist (sprich: dessen Session gerade läuft). Mir ist klar, dass unter Vista und Win7 mehrere Benutzer gleichzeitig angemeldet sein können - allerdings muss doch irgendwie zu ermitteln sein, wer der Benutzer der aktuellen Session ist (von der das Programm gestartet wurde).

Dasselbe Problem besteht hier:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
     Reg := TRegistry.Create;
     try
        Reg.RootKey := HKEY_CURRENT_USER;
        Reg.OpenKeyReadOnly('\Volatile Environment\');
        result := Reg.ReadString('USERDOMAIN');
        Reg.CloseKey;
     except
        result := '';
     end;
     Reg.Free;


HKEY_CURRENT_USER ist in dem Fall wieder der Adminaccount, es könnte also die falsche Domäne zurückgegeben werden (nämlich die des Admins, nicht die des aktuell angemeldeten Benutzers).

Mit GetUserNameEx besteht übrigens dasselbe Problem auch.

Hat mir jemand einen Tipp?

Danke!
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 07.01.10 12:45 
user profile iconAScomp hat folgendes geschrieben Zum zitierten Posting springen:
mit der API-Funktion GetUserName ermittle ich bisher den Namen des Benutzers:

Nein tust du nicht. Damit ermittelst nur den Benutzer unter dessen Kontext der aktuelle Prozess ausgeführt wird. Und es gibt nicht den angemeldeten Benutzer unter Windows. Benutzer können remote angemeldet sein oder über eine Terminalsession, ... Welchen Benutzer willst du jetzt haben?
AScomp Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 162


Delphi 5, Delphi 7, Delphi 2007, Delphi 2009, Delphi XE, Delphi 10 Seattle
BeitragVerfasst: Do 07.01.10 14:21 
Hallo,

das Thema hat sich erledigt.

Gemeint war der tatsächlich gerade angemeldete Benutzer (also der, der die Software manuell gestartet hat). Quasi der, der sich zuletzt angemeldet hat bzw. auf dessen Account zuletzt geswitcht wurde.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 07.01.10 14:29 
user profile iconAScomp hat folgendes geschrieben Zum zitierten Posting springen:
Gemeint war der tatsächlich gerade angemeldete Benutzer

Du hast nicht verstanden, was ich geschrieben habe oder? Es gibt den tatsächlich angemeldeten Benutzer NICHT!

Zitat:
(also der, der die Software manuell gestartet hat).

Das ist was ganz anderes. Der Prozess kann auch von einem Remotebenutzer oder von einer Terminalsession gestartet worden sein.

Noch mal: Du hast fünf Terminalsessions, drei Remotebenutzer und einen der aktiv vor dem Rechner sitzt. Welcher ist jetzt DEr angenmeldete Benutzer?

Zitat:
Quasi der, der sich zuletzt angemeldet hat bzw. auf dessen Account zuletzt geswitcht wurde.

Du willst also den Benutzer, der sich zu letzt am System angemeldet hat? Egal ob remote oder sonst wie?
AScomp Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 162


Delphi 5, Delphi 7, Delphi 2007, Delphi 2009, Delphi XE, Delphi 10 Seattle
BeitragVerfasst: Do 07.01.10 14:36 
user profile iconLuckie hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconAScomp hat folgendes geschrieben Zum zitierten Posting springen:
Gemeint war der tatsächlich gerade angemeldete Benutzer

Du hast nicht verstanden, was ich geschrieben habe oder? Es gibt den tatsächlich angemeldeten Benutzer NICHT!


Ich glaub eher, du hast nicht ganz verstanden. ;) Aber ist auch egal, wie gesagt: Thema erledigt.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Do 07.01.10 14:39 
Moin!

user profile iconAScomp hat folgendes geschrieben Zum zitierten Posting springen:
Aber ist auch egal, wie gesagt: Thema erledigt.
Mich würde ja mal deine Lösung interessieren. ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
AScomp Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 162


Delphi 5, Delphi 7, Delphi 2007, Delphi 2009, Delphi XE, Delphi 10 Seattle
BeitragVerfasst: Do 07.01.10 14:42 
Es geht um den zuletzt angemeldeten Benutzeraccount (bzw. der letzte Switch).

Hab nach langer Suche herausgefunden, wo diese Info von Vista/Win7 gespeichert wird:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
function GetCurrentComputerAndUserName: string;
const
     Winlogonkey = '\Software\Microsoft\Windows\CurrentVersion\Authentication\LogonUI';
begin
     Result := '';
     with TRegistry.Create do begin
          RootKey := HKEY_LOCAL_MACHINE;
          if OpenKeyReadOnly(WinLogonKey) then
             Result := ReadString('LastLoggedOnSAMUser');
          CloseKey;
          Free;
     end;
end;
AScomp Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 162


Delphi 5, Delphi 7, Delphi 2007, Delphi 2009, Delphi XE, Delphi 10 Seattle
BeitragVerfasst: Do 07.01.10 15:46 
Wobei das auch nur auf Nicht-Servern Sinn macht. Auf Servern können ja mehrere Benutzer gleichzeitig angemeldet sein und arbeiten - sprich: der zuletzt angemeldete Benutzer muss nicht unbedingt derjenige sein, der das Programm auch gestartet hat.

Hab noch andere Möglichkeiten gefunden, das sind aber alles Bastellösungen (GetTokenInformation von der explorer.exe beispielsweise).

Ich formuliere daher die Frage mal um: Wie finde ich heraus, wer die programm.exe gestartet hat? Wobei das wieder das nächste Problem aufwirft: Wer hat eigentlich die programm.exe gestartet, wenn sie doch Adminrechte benötigt? Theoretisch ja der Admin, praktisch aber der User, der die Exe angeklickt hat. Ich müsste letzteres herausfinden.

Noch irgendwelche Tipps?

@Luckie: Jetzt versteh ich auch, wie das Missverständnis zustande kam. Mit "aktiver Benutzer" meine ich den aktiven Benutzer, der das Programm gestartet hat (aktiv/manuell).
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 07.01.10 16:09 
user profile iconAScomp hat folgendes geschrieben Zum zitierten Posting springen:
Wer hat eigentlich die programm.exe gestartet, wenn sie doch Adminrechte benötigt? Theoretisch ja der Admin, praktisch aber der User, der die Exe angeklickt hat. Ich müsste letzteres herausfinden.

Für Windows war es der Administrator, da zum Starten die Logininformationen des Administrators verwendet wurden. Welche Haarfarbe der Mensch hat, der die Exe doppelt angeklickt hat, weiß Windows nicht und interessiert Windows auch nicht.

Zitat:
@Luckie: Jetzt versteh ich auch, wie das Missverständnis zustande kam. Mit "aktiver Benutzer" meine ich den aktiven Benutzer, der das Programm gestartet hat (aktiv/manuell).

Den bekommst du mit GetUsername, das ist richtig.
AScomp Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 162


Delphi 5, Delphi 7, Delphi 2007, Delphi 2009, Delphi XE, Delphi 10 Seattle
BeitragVerfasst: Do 07.01.10 16:18 
Zitat:
Zitat:
@Luckie: Jetzt versteh ich auch, wie das Missverständnis zustande kam. Mit "aktiver Benutzer" meine ich den aktiven Benutzer, der das Programm gestartet hat (aktiv/manuell).

Den bekommst du mit GetUsername, das ist richtig.


Eben nicht. Ich bekomm damit den Administrator, mit dessen Rechten das Programm gestartet wurde. Nicht aber den tatsächlich angemeldeten Benutzer, von dessen Account aus das Programm gestartet wurde. Das ist aber derjenige, den ich suche. ;)

Vereinfacht ausgedrückt: Ich benötige den Benutzer der aktuellen Windows-Session, auf der die Exe gestartet wurde (InnoSetup nennt diesen "OriginalUser").

Sprich: User "Irgendwas" meldet sich an, startet das Programm. Da das Programm Adminrechte voraussetzt, läuft es unter dem Adminkonto - CurrentUser und GetUsername liefert also den Admin-Account. Ich möchte aber als result den User "Irgendwas" (unabhängig von seiner Haarfarbe).
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Do 07.01.10 16:34 
Jap, da war das Stichwort.

Du suchst den Eigentümer der Session, zu der der Desktop gehört in dem die Anwendung läuft.

Also OpenInputDesktop und GetUserObjectInformation mit UOI_USER_SID müsste dann helfen. Aus der SID kommt man ja recht einfach auf den Namen.

Müsstest ggf. experimentieren, eigentlich ist der Eigentümer des Desktop ja nicht zwingend auch der Eigentümer der Session.

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."


Zuletzt bearbeitet von Martok am Do 07.01.10 16:37, insgesamt 1-mal bearbeitet
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 07.01.10 16:34 
user profile iconAScomp hat folgendes geschrieben Zum zitierten Posting springen:
Eben nicht. Ich bekomm damit den Administrator, mit dessen Rechten das Programm gestartet wurde.

Genau das hast du doch immer gesagt: "Mit "aktiver Benutzer" meine ich den aktiven Benutzer, der das Programm gestartet hat (aktiv/manuell).

Zitat:
Sprich: User "Irgendwas" meldet sich an, startet das Programm. Da das Programm Adminrechte voraussetzt, läuft es unter dem Adminkonto - CurrentUser und GetUsername liefert also den Admin-Account. Ich möchte aber als result den User "Irgendwas" (unabhängig von seiner Haarfarbe).

Das ist wieder was ganz anderes. Du willst den Benutzer, der die Taste der Maus bedient hat, um die Exe mit einem Doppelklick auszuführen.
AScomp Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 162


Delphi 5, Delphi 7, Delphi 2007, Delphi 2009, Delphi XE, Delphi 10 Seattle
BeitragVerfasst: Do 07.01.10 17:58 
user profile iconLuckie hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconAScomp hat folgendes geschrieben Zum zitierten Posting springen:
Eben nicht. Ich bekomm damit den Administrator, mit dessen Rechten das Programm gestartet wurde.

Genau das hast du doch immer gesagt: "Mit "aktiver Benutzer" meine ich den aktiven Benutzer, der das Programm gestartet hat (aktiv/manuell).


Das ist aber NICHT der Admin. Der Adminaccount ist im eigentlichen Sinne ja nicht aktiv (= angemeldet).


Zitat:
Sprich: User "Irgendwas" meldet sich an, startet das Programm. Da das Programm Adminrechte voraussetzt, läuft es unter dem Adminkonto - CurrentUser und GetUsername liefert also den Admin-Account. Ich möchte aber als result den User "Irgendwas" (unabhängig von seiner Haarfarbe).

Zitat:
Das ist wieder was ganz anderes. Du willst den Benutzer, der die Taste der Maus bedient hat, um die Exe mit einem Doppelklick auszuführen.


Ja, oder wie ich bereits mehrfach sagte: Der, der das Programm MANUELL gestartet hat. ;-)

@Martok: Danke, so werd ich's mal probieren!