Freigeben über


Interaktive Dienste

In der Regel handelt es sich bei Diensten um Konsolenanwendungen, die ohne grafische Benutzeroberfläche (GUI) unbeaufsichtigt ausgeführt werden sollen. Einige Dienste erfordern jedoch 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 nicht direkt mit einem Benutzer als Windows Vista interagieren. Daher sollten die im Abschnitt "Using an Interactive Service" genannten Techniken nicht im neuen Code verwendet werden.

 

Interaktion mit einem Benutzer aus einem Dienst indirekt

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 WTSendMessage--Funktion.

  • 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 Interprocess Communication (IPC) kommunizieren soll, z. B. benannte Rohre. Der Dienst kommuniziert mit der GUI-Anwendung, um ihm 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, sodass er in jeder Sitzung ausgeführt wird: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run. Wenn die Anwendung benannte Pipes für IPC verwendet, kann der Server zwischen mehreren Benutzerprozessen unterscheiden, indem jedem 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:

  • Anzeigen eines Meldungsfelds durch Aufrufen der MessageBox--Funktion mit MB_SERVICE_NOTIFICATION. Dies wird empfohlen, um einfache Statusmeldungen anzuzeigen. Rufen Sie MessageBox- während der Dienstinitialisierung oder aus der HandlerEx Routine nicht 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 nichtinteraktive Fensterstation und können nicht mit dem Benutzer interagieren. Ein interaktiver Dienst kann jedoch eine Benutzeroberfläche anzeigen und Benutzereingaben empfangen.

Vorsicht

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 eine 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 OpenWindowStation- oder GetThreadDesktop-funktion aufrufen.

 

Gehen Sie zum Erstellen eines interaktiven Diensts beim Aufrufen der CreateService--Funktion wie folgt vor:

  1. Geben Sie NULL für den parameter lpServiceStartName an, um den Dienst im Kontext des LocalSystem-Kontosauszuführen.
  2. Geben Sie das SERVICE_INTERACTIVE_PROCESS-Flag an.

Um festzustellen, 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 einen Wert enthält, NoInteractiveServices, der die Auswirkung von SERVICE_INTERACTIVE_PROCESS steuert:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Windows

Der NoInteractiveServices Standardwert ist 1, was bedeutet, dass kein Dienst interaktiv ausgeführt werden darf, unabhängig davon, ob er SERVICE_INTERACTIVE_PROCESShat. 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 Standardwert ist 0, was bedeutet, dass Dienste mit SERVICE_INTERACTIVE_PROCESS interaktiv ausgeführt werden dürfen. Wenn NoInteractiveServices- auf einen Wert ungleich Null festgelegt ist, darf kein Dienst danach interaktiv ausgeführt werden, unabhängig davon, ob er SERVICE_INTERACTIVE_PROCESShat.

Wichtig

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