Interactive Services

In der Regel handelt es sich bei Diensten um Konsolenanwendungen, die für die unbeaufsichtigte Ausführung ohne grafische Benutzeroberfläche (GUI) konzipiert sind. Einige Dienste erfordern jedoch möglicherweise gelegentliche Interaktionen mit einem Benutzer. Auf dieser Seite werden die besten Möglichkeiten für die Interaktion mit dem Benutzer aus einem Dienst erläutert.

Wichtig

Dienste können ab Windows Vista nicht direkt mit einem Benutzer interagieren. Daher sollten die im Abschnitt Using an Interactive Service (Verwenden eines interaktiven Diensts) erwähnten Techniken nicht in neuem Code verwendet werden.

Indirekte Interaktion mit einem Benutzer aus einem Dienst

Sie können die folgenden Techniken verwenden, um mit dem Benutzer über einen Dienst in allen unterstützten Versionen von Windows zu interagieren:

  • Zeigen Sie ein Dialogfeld in der Sitzung des Benutzers mithilfe der WTSSendMessage-Funktion an.

  • Erstellen Sie eine separate ausgeblendete GUI-Anwendung, und verwenden Sie die CreateProcessAsUser-Funktion, um die Anwendung im Kontext des interaktiven Benutzers auszuführen. Entwerfen Sie die GUI-Anwendung so, dass sie mit dem Dienst über eine Methode der prozessübergreifenden Kommunikation (InterProcess Communication, IPC) kommuniziert, z. B. Named Pipes. Der Dienst kommuniziert mit der GUI-Anwendung, um ihm mitzuteilen, wann die GUI angezeigt werden soll. Die Anwendung gibt die Ergebnisse der Benutzerinteraktion an den Dienst zurück, damit der Dienst die entsprechende Aktion ergreifen kann. Beachten Sie, dass IPC Ihre Dienstschnittstellen über das Netzwerk verfügbar machen kann, es sei denn, Sie verwenden eine entsprechende Zugriffssteuerungsliste (Access Control List, ACL).

    Wenn dieser Dienst auf einem Multiusersystem ausgeführt wird, fügen Sie die Anwendung dem folgenden Schlüssel hinzu, damit sie 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 jeder Pipe basierend auf der Sitzungs-ID ein eindeutiger Name gegeben wird.

Die folgende Technik ist auch für Windows Server 2003 und Windows XP verfügbar:

  • Zeigen Sie ein Meldungsfeld an, indem Sie die MessageBox-Funktion mit MB SERVICE _ _ NOTIFICATION aufrufen. Dies wird empfohlen, um einfache Statusmeldungen anzuzeigen. Rufen Sie MessageBox nicht während der Dienstinitialisierung oder über die HandlerEx-Routine auf, es sei denn, Sie rufen sie aus einem separaten Thread auf, sodass Sie rechtzeitig zum SCM zurückkehren.

Verwenden eines interaktiven Diensts

Standardmäßig verwenden Dienste eine nicht interaktive Fensterstation und können nicht mit dem Benutzer interagieren. Ein interaktiver Dienst kann jedoch eine Benutzeroberfläche anzeigen und Benutzereingaben empfangen.

Achtung

Dienste, die in einem Sicherheitskontext mit erhöhten Rechten ausgeführt werden, z. B. das LocalSystem-Konto, sollten kein Fenster auf dem interaktiven Desktop erstellen, da jede andere Anwendung, die auf dem interaktiven Desktop ausgeführt wird, mit diesem Fenster interagieren kann. Dadurch wird der Dienst für jede Anwendung verfügbar gemacht, die ein angemeldeter Benutzer ausführt. Außerdem sollten Dienste, die als LocalSystem ausgeführt werden, nicht auf den interaktiven Desktop zugreifen, indem sie die Funktion OpenWindowStation oder GetThreadDesktop aufrufen.

Um einen interaktiven Dienst zu erstellen, gehen Sie wie folgt vor, wenn Sie die CreateService-Funktion aufrufen:

  1. Geben Sie NULL für den lpServiceStartName-Parameter an, um den Dienst im Kontext des LocalSystem-Kontosauszuführen.
  2. Geben Sie das SERVICE _ INTERACTIVE _ PROCESS-Flag an.

Um zu bestimmen, ob ein Dienst als interaktiver Dienst ausgeführt wird, rufen Sie die GetProcessWindowStation-Funktion auf, um ein Handle für die Fensterstation abzurufen, und die GetUserObjectInformation-Funktion, um zu testen, ob die Fensterstation über das WSF _ VISIBLE-Attribut verfügt.

Beachten Sie jedoch, dass der folgende Registrierungsschlüssel den Wert NoInteractiveServices enthält, der die Auswirkung von SERVICE _ INTERACTIVE PROCESS _ steuert:

HKEY _ LOCAL MACHINE SYSTEM _ \ \ CurrentControlSet \ Control \ Windows

Der NoInteractiveServices-Wert ist standardmäßig auf 1 eingestellt. Dies bedeutet, dass kein Dienst interaktiv ausgeführt werden darf, unabhängig davon, ob er über SERVICE INTERACTIVE PROCESS _ _ verfügt. Wenn NoInteractiveServices auf 0 festgelegt ist, dürfen Dienste mit SERVICE INTERACTIVE _ _ PROCESS interaktiv ausgeführt werden.

Windows 7, Windows Server 2008 R2, Windows XP und Windows Server 2003: Der NoInteractiveServices-Wert ist standardmäßig auf 0 (0) eingestellt. Dies bedeutet, dass Dienste mit SERVICE INTERACTIVE _ _ PROCESS interaktiv ausgeführt werden dürfen. Wenn NoInteractiveServices auf einen Wert ungleich 0 (null) festgelegt ist, kann kein danach gestarteter Dienst interaktiv ausgeführt werden, unabhängig davon, ob er über SERVICE INTERACTIVE PROCESS _ _ verfügt.

Wichtig

Alle Dienste werden in der Terminaldienstesitzung 0 ausgeführt. Wenn ein interaktiver Dienst eine Benutzeroberfläche anzeigt, ist er daher nur für den Benutzer sichtbar, der eine Verbindung mit Sitzung 0 hergestellt hat. Da es keine Möglichkeit gibt, sicherzustellen, dass der interaktive Benutzer mit Sitzung 0 verbunden ist, konfigurieren Sie keinen Dienst so, dass er als interaktiver Dienst unter Terminaldienste oder auf einem System ausgeführt wird, das schnelles Wechseln von Benutzern unterstützt (schneller Benutzerwechsel wird mithilfe von Terminaldiensten implementiert).