Autor |
Beitrag |
AScomp
      
Beiträge: 162
Delphi 5, Delphi 7, Delphi 2007, Delphi 2009, Delphi XE, Delphi 10 Seattle
|
Verfasst: Do 07.01.10 08:17
Guten Morgen,
mit der API-Funktion GetUserName ermittle ich bisher den Namen des Benutzers:
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:
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
|
Verfasst: Do 07.01.10 12:45
AScomp hat folgendes geschrieben : | 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 
      
Beiträge: 162
Delphi 5, Delphi 7, Delphi 2007, Delphi 2009, Delphi XE, Delphi 10 Seattle
|
Verfasst: 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
|
Verfasst: Do 07.01.10 14:29
AScomp hat folgendes geschrieben : | 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 
      
Beiträge: 162
Delphi 5, Delphi 7, Delphi 2007, Delphi 2009, Delphi XE, Delphi 10 Seattle
|
Verfasst: Do 07.01.10 14:36
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 07.01.10 14:39
Moin!
AScomp hat folgendes geschrieben : | 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 
      
Beiträge: 162
Delphi 5, Delphi 7, Delphi 2007, Delphi 2009, Delphi XE, Delphi 10 Seattle
|
Verfasst: 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:
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 
      
Beiträge: 162
Delphi 5, Delphi 7, Delphi 2007, Delphi 2009, Delphi XE, Delphi 10 Seattle
|
Verfasst: 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
|
Verfasst: Do 07.01.10 16:09
AScomp hat folgendes geschrieben : | 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 
      
Beiträge: 162
Delphi 5, Delphi 7, Delphi 2007, Delphi 2009, Delphi XE, Delphi 10 Seattle
|
Verfasst: 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
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: 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
|
Verfasst: Do 07.01.10 16:34
AScomp hat folgendes geschrieben : | 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 
      
Beiträge: 162
Delphi 5, Delphi 7, Delphi 2007, Delphi 2009, Delphi XE, Delphi 10 Seattle
|
Verfasst: Do 07.01.10 17:58
|
|
|