Wie kann ich die geöffneten Fenster (~ EnumWindows) einer anderen Benutzersitzung aufzählen?

8

Ich habe eine Anwendung, die die geöffneten Fenster der aktuellen Sitzung auflisten kann. Es verwendet die EnumWindows-Methode aus der user32.dll.

Ich möchte diesen Code von einem Windows-Dienst ausführen, aber da der Dienst keiner Benutzersitzung zugeordnet ist, gibt er nichts offensichtlich zurück.

Die Frage ist also, wie kann ich die geöffneten Fenster einer anderen Benutzersitzung (z. B. mit einem bestimmten Anmeldebenutzer) aufzählen?

Ähnlich wie EnumWindows möchte ich auch das Vordergrundfenster der Benutzersitzung holen (wie GetForegroundWindow für den aktuellen Benutzer funktioniert).

    
Gaspar Nagy 21.11.2008, 07:40
quelle

3 Antworten

5

Soweit mir bekannt ist, können Sie nicht auf die Fenster einer Sitzung von einer anderen zugreifen. Es ist auch erwähnenswert, dass es so etwas wie "die aktuelle Sitzung" nicht gibt - es kann mehrere Benutzer geben, die durch Terminal-Dienste angemeldet sind, oder XPs schnelle Benutzerumschaltung.

Ein Ansatz dazu wäre, jedem Benutzerprofil ein Programm hinzuzufügen, ohne Benutzeroberfläche, die nur mit Ihrem Dienst kommuniziert. Sie müssen jedoch mit der Tatsache zurechtkommen, dass es mehrere aktive Sitzungen geben könnte.

    
DavidK 21.11.2008, 22:47
quelle
5

Nach diesem Dokument Sie kann einen Prozess in der Anmeldesitzung eines anderen Benutzers mit CreateProcessAsUser erstellen und die Fenster dort aufzählen. Sie werden weiterhin einen IPC-Mechanismus benötigen, um mit dem Dienst zu kommunizieren.

    
csgero 24.11.2008 11:16
quelle
4

Die angenommene Antwort ist nicht korrekt.

  

Die Frage ist also, wie kann ich die geöffneten Fenster einer anderen Benutzersitzung aufzählen?

Sie können die geöffneten Fenster jeder Sitzung aufzählen, wenn Sie als Dienst ausgeführt werden, der als lokales Systemkonto ausgeführt wird.

Um dies zu tun, listen Sie zuerst die Sitzungen mit WTSEnumerateSessions auf. Dann nummerieren Sie die Fenster Stationen in jeder Sitzung mit EnumWindowStations . Dann listen Sie die Desktops für jede Window Station mit EnumDesktops auf. Schließlich listen Sie die Windows in diesen Desktops mit EnumWindows auf.

  

(z. B. mit einem bestimmten Anmeldebenutzer)

Es können viele gleichzeitig angemeldete Benutzer über Terminaldienste oder schnelle Benutzerwechsel verfügen.

  

Ähnlich wie EnumWindows möchte ich auch das Vordergrundfenster der Benutzersitzung holen (wie GetForegroundWindow für den aktuellen Benutzer funktioniert).

Dies kann durch Starten einer App mit einem gefundenen Benutzer-Token in der Sitzung, der Window Station und dem Desktop erfolgen. Von dort können Sie jede Win32-API wie GetForegroundWindow aufrufen und die Informationen an den übergeordneten Prozess zurückmelden.

Sie können mehr darüber erfahren wie Sitzungen, Fensterstationen und Desktops hier funktionieren .

    
Brian R. Bondy 22.10.2010 14:47
quelle

Tags und Links