Interaktive Dienste

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 eine gelegentliche Interaktion mit einem Benutzer. Auf dieser Seite werden die besten Möglichkeiten für die Interaktion mit dem Benutzer über einen 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 genannten Techniken nicht in neuem Code verwendet werden.

 

Indirektes Interagieren mit einem Benutzer über einen Dienst

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

  • Anzeigen eines Dialogfelds in der Sitzung des Benutzers mithilfe der Funktion WTSSendMessage .

  • 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 für die Kommunikation mit dem Dienst über eine Methode der Interprocess Communication (IPC), z. B. Named Pipes. Der Dienst kommuniziert mit der GUI-Anwendung, um ihr mitzuteilen, wann die GUI angezeigt werden soll. Die Anwendung kommuniziert die Ergebnisse der Benutzerinteraktion zurück an den Dienst, damit der Dienst die entsprechende Aktion ausführen 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 Mehrbenutzersystem 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 mehrere Benutzerprozesse unterscheiden, indem er jeder Pipe einen eindeutigen Namen basierend auf der Sitzungs-ID räumt.

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 status Nachrichten anzuzeigen. Rufen Sie MessageBox während der Dienstinitialisierung oder aus der HandlerEx-Routine nicht auf, es sei denn, Sie rufen es über einen separaten Thread auf, damit 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 Erhöhten Sicherheitskontext 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 von einem angemeldeten Benutzer ausgeführt wird. Außerdem sollten Dienste, die als LocalSystem ausgeführt werden, nicht auf den interaktiven Desktop zugreifen, indem sie die OpenWindowStation - oder GetThreadDesktop-Funktion aufrufen.

 

Um einen interaktiven Dienst zu erstellen, gehen Sie beim Aufrufen der CreateService-Funktion wie folgt vor:

  1. Geben Sie NULL für den lpServiceStartName-Parameter an, um den Dienst im Kontext des LocalSystem-Kontos auszuführen.
  2. Geben Sie das flag SERVICE_INTERACTIVE_PROCESS an.

Um zu ermitteln, 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 Attribut WSF_VISIBLE verfügt.

Beachten Sie jedoch, dass der folgende Registrierungsschlüssel den Wert NoInteractiveServices enthält, der die Auswirkungen von SERVICE_INTERACTIVE_PROCESS steuert:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Windows

Der NoInteractiveServices-Wert ist standardmäßig auf 1 festgelegt. Dies bedeutet, dass kein Dienst interaktiv ausgeführt werden darf, unabhängig davon, ob er SERVICE_INTERACTIVE_PROCESS hat. Wenn NoInteractiveServices auf 0 festgelegt ist, können 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 festgelegt. Dies bedeutet, dass Dienste mit SERVICE_INTERACTIVE_PROCESS interaktiv ausgeführt werden dürfen. Wenn NoInteractiveServices auf einen nichtzero-Wert festgelegt ist, darf kein anschließend gestarteter Dienst interaktiv ausgeführt werden, unabhängig davon, ob er SERVICE_INTERACTIVE_PROCESS hat.

Wichtig

Alle Dienste werden in Terminaldienstesitzung 0 ausgeführt. Wenn ein interaktiver Dienst daher eine Benutzeroberfläche anzeigt, ist sie nur für den Benutzer sichtbar, der mit Sitzung 0 verbunden ist. Da es keine Möglichkeit gibt, zu garantieren, dass der interaktive Benutzer mit Sitzung 0 verbunden ist, konfigurieren Sie keinen Dienst für die Ausführung als interaktiver Dienst unter Terminaldienste oder auf einem System, das einen schnellen Benutzerwechsel unterstützt (der schnelle Benutzerwechsel wird mithilfe von Terminaldiensten implementiert).