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 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.

Thanatos81 14. Aug 2008 10:12

Re: User einer WindowStation
 
Der Dienst sollte also alle Sessions enummerieren und in diesen jeweils einen Prozess starten, welcher nachschaut ob die Session die Session des gewünschten Users ist, dann alles an Fenster auflisten und dies an den Dienst zurückmelden?

Und das starten eines Prozesses in einer anderen Session als der eigenen soll sicherer/zuverlässiger sein, als die von mir oben verwendete Methode? Da bin ich schon ein wenig skeptisch...

Dezipaitor 14. Aug 2008 10:25

Re: User einer WindowStation
 
Zitat:

Zitat von Thanatos81
Der Dienst sollte also alle Sessions enummerieren und in diesen jeweils einen Prozess starten, welcher nachschaut ob die Session die Session des gewünschten Users ist, dann alles an Fenster auflisten und dies an den Dienst zurückmelden?

Jupp.
Zitat:

Zitat von Thanatos81
Und das starten eines Prozesses in einer anderen Session als der eigenen soll sicherer/zuverlässiger sein, als die von mir oben verwendete Methode? Da bin ich schon ein wenig skeptisch...

Das liegt daran, dass du keine Erfahrung und zuwenig Ahnung hast. Dein Programm kann jeder Nutzer aus dem Autostartmanager entfernen. Ein Prozess in die Session zu starten, ist absicherbar gegen Fehler.

Thanatos81 14. Aug 2008 10:49

Re: User einer WindowStation
 
Zitat:

Zitat von Dezipaitor
Zitat:

Zitat von Thanatos81
Und das starten eines Prozesses in einer anderen Session als der eigenen soll sicherer/zuverlässiger sein, als die von mir oben verwendete Methode? Da bin ich schon ein wenig skeptisch...

Das liegt daran, dass du keine Erfahrung und zuwenig Ahnung hast.

Ganz langsam mit den jungen Pferden. Von einem gleichaltrigen der mich nicht kennt an den Kopf geschmissen zu bekommen ich hätte keine Erfahrung ist schon ein starkes Stück. Mein erstes Programm erblickte das Licht der Welt auf nem C64, da befand ich mich gerade in der damals noch existierenden Orientierungsstufe. Und seit mehr als fünf Jahren arbeite ich tagtäglich mit Delphi. Dazwischen kamen Basic, Pascal und Java. Allerdings rührt meine Erfahrung mit Delphi eher von der Kommunikation mit Industriemaschinen und Datenbankanwendungen. Also in Bezug auf Dienste oder die WinAPI magst du Recht haben aber ansonsten verbitte ich mir die Aussage ich hätte keinerlei Erfahrung, was das Programmieren angeht.

Zitat:

Zitat von Dezipaitor
Dein Programm kann jeder Nutzer aus dem Autostartmanager entfernen. Ein Prozess in die Session zu starten, ist absicherbar gegen Fehler.

Das jeder Benutzer das Programm aus dem Autostart entfernen kann ist mir schon klar. Aber darum geht es hier nicht, es könnte auch jeder der zukünftigen Benutzer den Dienst stoppen. Es geht hier keineswegs um eine Mitarbeiterüberwachung, sondern die Nutzer des Programms installieren sich das Programm freiwillig und selbstständig um eine Aufzeichnung zu erhalten was sie wie lange nutzen. Die Idee diese Anwendung als Dienst umzusetzen rührt allein daher, dass es ein Icon in der TNA weniger wäre und um sich mit Diensten vertraut zu machen.

Und meine Skepsis wandte sich nicht gegen die Manipulierbarkeit durch den Nutzer. Ich meinte, dass ich mir nicht vorstellen kann, dass es sicherer in Bezug auf die Zuverlässigkeit des Programms ist in fremden Sessions Prozesse zu starten als sich Informationen über laufende Prozesse zu besorgen. Denn das Starten eines Prozesses ist ein wesentlich tieferer Eingriff und ließe sich eher als kritische Sicherheitslücke ausnutzen als das Auslesen von ein paar Informationen. Daher kann ich mir nicht vorstellen, dass Microsoft zwar das Starten von Prozessen in fremden Sessions vorgesehen hat, aber nicht das Auslesen von Informationen über bereits laufende Prozesse.

Dezipaitor 14. Aug 2008 16:48

Re: User einer WindowStation
 
Reg dich nicht auf. Die Texte kommen im Forum immer heftiger an, als sie gemeint sind!

Zitat:

Zitat von Thanatos81
Zitat:

Zitat von Dezipaitor
Zitat:

Zitat von Thanatos81
Und das starten eines Prozesses in einer anderen Session als der eigenen soll sicherer/zuverlässiger sein, als die von mir oben verwendete Methode? Da bin ich schon ein wenig skeptisch...

Das liegt daran, dass du keine Erfahrung und zuwenig Ahnung hast.

Ganz langsam mit den jungen Pferden. Von einem gleichaltrigen der mich nicht kennt an den Kopf geschmissen zu bekommen ich hätte keine Erfahrung ist schon ein starkes Stück. Mein erstes Programm erblickte das Licht der Welt auf nem C64, da befand ich mich gerade in der damals noch existierenden Orientierungsstufe. Und seit mehr als fünf Jahren arbeite ich tagtäglich mit Delphi. Dazwischen kamen Basic, Pascal und Java. Allerdings rührt meine Erfahrung mit Delphi eher von der Kommunikation mit Industriemaschinen und Datenbankanwendungen. Also in Bezug auf Dienste oder die WinAPI magst du Recht haben aber ansonsten verbitte ich mir die Aussage ich hätte keinerlei Erfahrung, was das Programmieren angeht.

Wenn du jetzt auch noch richtig gelesen hättest, dann hättest du gemerkt, dass ich mich nicht auf deine allgemeine Programmiererfahrung beziehe, sondern auf die Programmierung der Windows Security API und deine Skepsis (Daher der Quote). Dass du Skepsis hast an etwas, dass ich schon 50x erfolgreich gemacht habe, sagt mir eben, dass du keine Erfahrung damit hast. Aber siehe das nicht als Beleidigung, das ist auch nicht so beabsichtigt, sondern als Antwort auf deine Frage. Ich werde mich hüten, Beleidigungen auszusprechen!

Zitat:

Zitat von Thanatos81
Zitat:

Zitat von Dezipaitor
Dein Programm kann jeder Nutzer aus dem Autostartmanager entfernen. Ein Prozess in die Session zu starten, ist absicherbar gegen Fehler.

Das jeder Benutzer das Programm aus dem Autostart entfernen kann ist mir schon klar. Aber darum geht es hier nicht, es könnte auch jeder der zukünftigen Benutzer den Dienst stoppen. Es geht hier keineswegs um eine Mitarbeiterüberwachung, sondern die Nutzer des Programms installieren sich das Programm freiwillig und selbstständig um eine Aufzeichnung zu erhalten was sie wie lange nutzen. Die Idee diese Anwendung als Dienst umzusetzen rührt allein daher, dass es ein Icon in der TNA weniger wäre und um sich mit Diensten vertraut zu machen.

Du musst dich nicht rechtfertigen. Wie du es einsetzt, ist mir völlig gleichgültig.
Den Dienst stoppen können nur Admins, oder dazu berechtigte Personen.

Zitat:

Zitat von Thanatos81
Und meine Skepsis wandte sich nicht gegen die Manipulierbarkeit durch den Nutzer. Ich meinte, dass ich mir nicht vorstellen kann, dass es sicherer in Bezug auf die Zuverlässigkeit des Programms ist in fremden Sessions Prozesse zu starten als sich Informationen über laufende Prozesse zu besorgen. Denn das Starten eines Prozesses ist ein wesentlich tieferer Eingriff und ließe sich eher als kritische Sicherheitslücke ausnutzen als das Auslesen von ein paar Informationen. Daher kann ich mir nicht vorstellen, dass Microsoft zwar das Starten von Prozessen in fremden Sessions vorgesehen hat, aber nicht das Auslesen von Informationen über bereits laufende Prozesse.

Es funktioniert aber sehr gut. Das kannst du natürlich nicht wissen, da du eben keine Erfahrung hast! Und wüsstest du, wie es denn geht? Wenn nein, dann hast du keine Ahnung. Sonst will ich nichts gesagt haben. Ist das nicht logisch?


PS.
Ich programmiere seit 16 Jahren in Pascal, seit Delphi 1.0 in Delphi, seit über 2 Jahren in der Windows Security API und mache seit einem Jahr die JWSCL und betreue die JEDI API. Aber auch ich habe mal mit Unerfahrenheit angefangen.

Thanatos81 14. Aug 2008 16:56

Re: User einer WindowStation
 
Stimmt schon, dass im geschriebenen manches heftiger rüberkommt. Auf mich wirkte es halt nur so extrem, weil in deinem Satz keine Einschränkung enthalten war. Also wenns dir Recht ist, würde ich sagen: "Schwamm drüber, da hat einer den anderen falsch verstanden und fertig."

Zu dem Thema einen Prozess in einer Session eines anderen Users starten: Nein, da habe ich bisher noch keine Erfahrungen mit aber dank dir schon mal eine ungefähre Vorstellung was mich erwartet und wonach ich suchen kann. Falls ich dan konkrete Fragen habe, mache ich allerdings ein neues Topic auf, da es nicht mehr zu dem Titel passen würde. Für jetzt erst Mal herzlichen Dank an alle!


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:03 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