![]() |
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:
Kennt jemand eine Möglichkeit anhand des Handles einer WindowStation oder eines Desktops den zugehörigen Benutzer zu finden?
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; Vielen Dank im Vorraus! |
Re: User einer WindowStation
Liefert die API Function
Delphi-Quellcode:
nicht sowieso den angemeldeten Benutzer?
GetUserName
|
Re: User einer WindowStation
Nein tut sie nicht.
![]() Zitat:
|
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) |
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. |
Re: User einer WindowStation
Zitat:
|
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 ;-(
|
Re: User einer WindowStation
Man muss in jede Session ein Prozess starten, der diese Aufgabe übernimmt.
|
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! |
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.
|
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... |
Re: User einer WindowStation
Zitat:
Zitat:
|
Re: User einer WindowStation
Zitat:
Zitat:
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. |
Re: User einer WindowStation
Reg dich nicht auf. Die Texte kommen im Forum immer heftiger an, als sie gemeint sind!
Zitat:
Zitat:
Den Dienst stoppen können nur Admins, oder dazu berechtigte Personen. Zitat:
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. |
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