it-swarm.com.de

Wie kann ein Windows-Dienst eine GUI-Anwendung ausführen?

Ich habe einen Windows-Dienst geschrieben, der es mir ermöglicht, Anwendungen remote auszuführen und zu stoppen. Diese Anwendungen werden mit CreateProcess ausgeführt. Dies funktioniert für mich, da die meisten von ihnen nur die Back-End-Verarbeitung durchführen. In letzter Zeit muss ich Anwendungen ausführen, die dem aktuellen Benutzer eine Benutzeroberfläche bieten. Wie schreibe ich in C++, damit mein Dienst den aktuell aktiven Desktop finden und die GUI darauf ausführen kann?

43
sep

Die Antwort von Roger Lipscombe, um WTSEnumerateSessions zu verwenden, um den richtigen Desktop zu finden, dann CreateProcessAsUser , um die Anwendung auf diesem Desktop zu starten (Sie übergeben ihm das Handle des Desktops als Teil der STARTUPINFO Struktur) ist richtig.

Würde ich jedoch stark empfehlen, dies nicht zu tun. In einigen Umgebungen, wie z. B. Terminalserver-Hosts mit vielen aktiven Benutzern, ist es nicht einfach zu bestimmen, welcher Desktop der "aktive" Desktop ist.

Wenn jedoch eine Anwendung plötzlich auf dem Desktop eines Benutzers angezeigt wird, kann dies zu einem schlechten Zeitpunkt der Fall sein (entweder weil der Benutzer dies nicht erwartet oder weil Sie versuchen, die App zu starten, wenn die Sitzung nicht läuft.) Noch nicht ganz initialisiert, beim Herunterfahren oder was auch immer).

Ein herkömmlicherer Ansatz wäre, eine Verknüpfung zu einer kleinen Client-App für Ihren Dienst in der globalen Startgruppe zu erstellen. Diese App wird dann mit jeder Benutzersitzung gestartet und kann verwendet werden, um andere Apps zu starten (falls gewünscht), ohne dass Benutzeranmeldeinformationen, Sitzungen und/oder Desktops miteinander in Konflikt stehen.

Diese Verknüpfung kann auch von Administratoren nach Belieben verschoben/deaktiviert werden, was die Bereitstellung Ihrer Anwendung erheblich vereinfacht, da sie nicht von den Standards anderer Windows-Apps abweicht ...

52
mdb

Die kurze Antwort lautet "Sie nicht", da das Öffnen eines GUI-Programms, das in einem anderen Benutzerkontext ausgeführt wird, eine Sicherheitsanfälligkeit ist, die im Allgemeinen als Shatter Attack bekannt ist.

Sehen Sie sich diesen MSDN-Artikel an: Interactive Services . Es gibt einige Optionen für einen Dienst, um mit einem Benutzer zu interagieren.

Kurz gesagt, Sie haben folgende Möglichkeiten:

  • Zeigen Sie in der Benutzersitzung ein Dialogfeld mit der Funktion WTSSendMessage an.

  • Erstellen Sie eine separate verborgene GUI-Anwendung und führen Sie die Anwendung mit der Funktion CreateProcessAsUser im Kontext des interaktiven Benutzers aus. Entwerfen Sie die GUI-Anwendung für die Kommunikation mit dem Dienst über eine Methode der Interprozesskommunikation (IPC), z. B. Named Pipes. Der Dienst kommuniziert mit der GUI-Anwendung, um anzugeben, wann die GUI angezeigt werden soll. Die Anwendung teilt dem Dienst die Ergebnisse der Benutzerinteraktion mit, so dass der Dienst die entsprechenden Maßnahmen ergreifen kann. Beachten Sie, dass IPC Ihre Service-Schnittstellen über das Netzwerk verfügbar machen kann, sofern Sie keine entsprechende Zugriffssteuerungsliste (ACL) verwenden.

    Wenn dieser Dienst auf einem Mehrbenutzersystem ausgeführt wird, fügen Sie die Anwendung dem folgenden Schlüssel hinzu, sodass er in jeder Sitzung ausgeführt wird: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run. Wenn die Anwendung Named Pipes für IPC verwendet, kann der Server zwischen mehreren Benutzerprozessen unterscheiden, indem er jeder Pipe basierend auf der Sitzungs-ID einen eindeutigen Namen gibt.

16
mlarsen

WTSEnumerateSessions und CreateProcessAsUser.

6
Roger Lipscombe

Mehrere Personen schlugen WTSEnumerateSessions und CreateProcessAsUser vor. Ich frage mich, warum niemand WTSGetActiveConsoleSessionId vorgeschlagen hat, da Sie sagten, Sie möchten nur einen angemeldeten Benutzer anvisieren.

Einige Leute sind jedoch sicher, CreateProcessAsUser vorzuschlagen. Wenn Sie den einfachen alten CreateProcess so aufrufen, wie Sie es gesagt haben, wird die GUI der Anwendung mit den Berechtigungen Ihres Dienstes und nicht mit den Berechtigungen des Benutzers ausgeführt.

5

Die Probleme Sitzung 0, Interaktive Dienste, Windows-Dienst ermöglicht die Interaktion des Diensts mit Desktop Unter Windows 7 oder Windows Vista

Sie können diesen Artikel lesen http://www.codeproject.com/KB/Vista-security/SubvertingVistaUAC.aspx

Ich versuche es hier zu erklären, es funktioniert unter Windows 7

2
mtaskopru

Bei Win2K, XP und Win2K3 ist der Konsolenbenutzer in Sitzung 0 angemeldet, in derselben Sitzung, in der die Dienste leben. Wenn ein Dienst als interaktiv konfiguriert ist, kann er die Benutzeroberfläche auf dem Desktop des Benutzers anzeigen.

Unter Vista kann jedoch kein Benutzer in Sitzung 0 angemeldet sein. Wenn die Benutzeroberfläche eines Dienstes angezeigt wird, ist dies etwas schwieriger. Sie müssen die aktiven Sitzungen mit WTSEnumerateSessions API auflisten, die Konsolensitzung suchen und den Prozess als diesen Benutzer erstellen. Natürlich benötigen Sie dazu auch ein Token oder Benutzeranmeldeinformationen. Sie können weitere Details zu diesem Prozess lesen hier .

1
Franci Penov

Wichtige Dienste können ab Windows Vista nicht direkt mit einem Benutzer interagieren. Daher sollten die im Abschnitt Verwenden eines interaktiven Dienstes genannten Techniken nicht in neuem Code verwendet werden.

Dies ist aus: http://msdn.Microsoft.com/en-us/library/ms683502(VS.85).aspx

0
Stéphane

Ich denke, solange Sie nur einen Benutzer angemeldet haben, wird dieser automatisch auf dem Desktop dieses Benutzers angezeigt. 

Seien Sie trotzdem vorsichtig, wenn ein Dienst ein Exe startet. 

Wenn der Schreibzugriff auf den Ordner mit dem Exe nicht eingeschränkt ist, kann jeder Benutzer dieses Exe durch ein anderes Programm ersetzen, das dann mit Systemrechten ausgeführt wird. Nehmen Sie zum Beispiel cmd.exe (verfügbar auf allen Windows-Systemen). Wenn der Dienst das nächste Mal versucht, Ihr Exe zu starten, erhalten Sie einen Befehl Shell mit Systemrechten ...

0
Treb

Wenn Sie eine GUI von Ihrem Dienst aus starten, wird sie auf dem aktuell aktiven Desktop angezeigt.

Aber nur, wenn Sie die Dienstberechtigungen angepasst haben: Sie müssen zulassen, dass Sie mit dem Desktop interagieren .

0
mkoeller