Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi User einer WindowStation (https://www.delphipraxis.net/118746-user-einer-windowstation.html)

Thanatos81 14. Aug 2008 08:13


User einer WindowStation
 
Moin zusammen!

Wir haben hausintern ein Programm, welches alle Fenstertitel auflistet, mit einer vorher angelegten Liste vergleicht und bei Übereinstimmung die Laufzeit des Programms protokolliert. Diese Anwendung liegt bei fast jedem Mitarbeiter im Autostart und "läuft als Symbol in der TNA im Hintergrund".

Nun möchte ich als Fingerübung das Programm in einen Service umschreiben. Die ersten Schritte waren auch alle von Erfolg gekrönt. Ich iteriere durch alle WindowStations, öffnen den Standard-Desktop der WindowStation und enummeriere alle Fenstertitel. Nun kann es vorkommen, dass ein PC von mehreren Mitarbeitern genutzt wird. Deswegen soll nur aufgezeichnet werden, wenn die Anwendung von einem vorher definierten Benutzer ausgeführt wird.

Also würde ich gerne raus finden, welcher Benutzer in der jeweiligen WindowStation angemeldet ist. Mein bisheriger Code sieht folgendermaßen aus:
Delphi-Quellcode:
wsList := TWindowList.Create; //Liste aller WindowStations
wiList := TWindowList.Create; //Liste der Fenster einer WindowStation
try
  wsList.EnumWindowStations;
  for k := 0 to wsList.Count - 1 do
  begin
    wWnd := 0;
    dWnd := 0;
    wWnd := OpenWindowStation(wiList[k], FALSE, MAXIMUM_ALLOWED); //WindowStation öffnen
    if wWnd <> 0 then
      if SetProcessWindowStation(wWnd) then //Zur WindowStation verbinden
        dWnd := OpenDesktop('Default', 0, FALSE, MAXIMUM_ALLOWED); //Desktop öffnen
    if dWnd <> 0 then
      if SetThreadDesktop(dWnd) then //Zum Desktop verbinden
      begin
        wiList.EnumTopLevelWindows; //Fenster des Dekstops suchen
        for l := 0 to wiList.Count - 1 do
          if IsMainAppWindow(wiList.Handles[l]) then
            s := s + wiList[l] + ';';
      end;
  end;
  protIt(s);
finally
  FreeAndNil(wsList);
  FreeAndNil(wiList);
end;
Kennt jemand eine Möglichkeit anhand des Handles einer WindowStation oder eines Desktops den zugehörigen Benutzer zu finden?

Vielen Dank im Vorraus!

Tyrael Y. 14. Aug 2008 08:19

Re: User einer WindowStation
 
Liefert die API Function

Delphi-Quellcode:
GetUserName
nicht sowieso den angemeldeten Benutzer?

Luckie 14. Aug 2008 08:24

Re: User einer WindowStation
 
Nein tut sie nicht. MSDN-Library durchsuchenGetUsername gibt den Benutzernamen aus, in dessem Kontext der aufrufenden Thread ausgeführt wird.
Zitat:

Zitat von Windows SDK
Retrieves the name of the user associated with the current thread.

Ausserdem können meherere Benutzer an einem Rechner angemeldet sein, was sollte da GetUsername zurückliefern, wenn es so funktionieren würde, wie du denkst.

Dezipaitor 14. Aug 2008 08:28

Re: User einer WindowStation
 
Der angemeldete User steckt in der Session, nicht in der Windowstation!
Zudem funktioniert das Fensterhandleauslesen nicht über Dienste. Dass es hier funktioniert liegt nur daran, dass unter XP Dienste und der erste angemeldete Benutzer sich in derselben Session 0 befinden. Über Sessiongrenzen hinweg, wie bei FUS oder Vista wird das versagen.
WTSQuerySessionInformation liefert dir mit WTSGetActiveConsoleSession den Name des am PC sitzenden, eingeloggten Benutzers. In Windows 2000 Workstation funkz das nicht. Dann müssen Ausweichroutinen her, wie z.B. in der JWSCL.

Bitte beachten, dass mehrere Leute sich in einer Session anmelden können (z.B. runas)

Thanatos81 14. Aug 2008 09:12

Re: User einer WindowStation
 
Hmmm...

Wie wäre es mit einer anderen Vorgehensweise. Ich könnte mir ja eine Liste aller laufenden Prozesse holen und hätte dabei die Information unter welchem Benutzerkonto der Prozess ausgeführt wird. Das sollte ja auch im Multi-User-Betrieb funktionieren, siehe Windows Taskmanager. Könnte ich dann innerhalb des Dienstes anhand des Prozesshandles den Fenstertitel auslesen?

Denn den Fenstertitel bräuchte ich, da der Hauptzweck des Programmes darin besteht, die Delphi-Fenster zu überwachen und das mit dem geöffneten Projekt. Wir nutzen das um einen ungefähren Überblick zu erhalten, wie lange an einem Projekt gearbeitet wird und dies dann mit unseren händischen Aufzeichnungen zu vergleichen.

Dezipaitor 14. Aug 2008 09:31

Re: User einer WindowStation
 
Zitat:

Zitat von Thanatos81
Hmmm...

Wie wäre es mit einer anderen Vorgehensweise. Ich könnte mir ja eine Liste aller laufenden Prozesse holen und hätte dabei die Information unter welchem Benutzerkonto der Prozess ausgeführt wird. Das sollte ja auch im Multi-User-Betrieb funktionieren, siehe Windows Taskmanager. Könnte ich dann innerhalb des Dienstes anhand des Prozesshandles den Fenstertitel auslesen?

Nein geht nicht. Fensterhandles über Sessiongrenzen hinweg zu nutzen ist nicht vorgesehen und verboten.

Thanatos81 14. Aug 2008 09:37

Re: User einer WindowStation
 
Es gibt also keine verlässliche Möglichkeit, als Dienst die Titel aller von einem Benutzer geöffneten Fenster zu erhalten? Das würde mich aber enttäuschen, dass so etwas nicht vorgesehen ist ;-(

Dezipaitor 14. Aug 2008 09:42

Re: User einer WindowStation
 
Man muss in jede Session ein Prozess starten, der diese Aufgabe übernimmt.

Thanatos81 14. Aug 2008 09:50

Re: User einer WindowStation
 
Und genau das wollte ich ja vermeiden, denn dann wäre ich wieder bei dem Stand, bei dem wir jetzt sind (In Tray minimiertes Programm beim Autostart). Schade, dann muss ich die Idee wohl als nicht durchführbar betrachten.

Trotzdem vielen Dank für die Antworten allerseits!

Dezipaitor 14. Aug 2008 10:07

Re: User einer WindowStation
 
Also ich rede nicht von einem Autorstartprogramm, sondern von einem Prozess der vom Dienst bei Notwendigkeit gestartet wird und sich dann beendet. Wer braucht denn da noch Autostart? Ist eh unzuverlässig.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:23 Uhr.
Seite 1 von 2  1 2      

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