Freigeben über


Einführung in Windows-Dienstanwendungen

Hinweis

Dieser Artikel gilt nicht für gehostete Dienste in .NET. Die neuesten Inhalte zu Windows-Diensten mit Microsoft.Extensions.Hosting.BackgroundService und der Vorlage "Worker Service" finden Sie unter:

Mit Microsoft Windows-Diensten, früher als NT-Dienste bezeichnet, können Sie ausführbare Anwendungen mit langer Ausführung erstellen, die in ihren eigenen Windows-Sitzungen ausgeführt werden. Diese Dienste können automatisch gestartet werden, wenn der Computer gestartet wird, angehalten und neu gestartet werden und keine Benutzeroberfläche anzeigen. Diese Funktionen machen Dienste ideal, um auf einem Server eingesetzt zu werden oder wann immer Sie eine lang andauernde Funktionalität benötigen, die sich nicht auf andere Benutzer auswirkt, die auf demselben Computer arbeiten. Sie können dienste auch im Sicherheitskontext eines bestimmten Benutzerkontos ausführen, das sich von dem angemeldeten Benutzer oder dem Standardcomputerkonto unterscheidet. Weitere Informationen zu Diensten und Windows-Sitzungen finden Sie in der Windows SDK-Dokumentation.

Sie können auf einfache Weise Dienste erstellen, indem Sie eine Anwendung erstellen, die als Dienst installiert ist. Angenommen, Sie möchten Leistungsindikatordaten überwachen und auf Schwellenwerte reagieren. Sie können eine Windows-Dienstanwendung schreiben, die die Leistungsindikatordaten überwacht, die Anwendung bereitstellen und mit dem Sammeln und Analysieren von Daten beginnen kann.

Sie erstellen Ihren Dienst als Microsoft Visual Studio-Projekt, definieren Code darin, der steuert, welche Befehle an den Dienst gesendet werden können und welche Aktionen ausgeführt werden sollen, wenn diese Befehle empfangen werden. Befehle, die an einen Dienst gesendet werden können, umfassen das Starten, Anhalten, Fortsetzen und Beenden des Diensts; Sie können auch benutzerdefinierte Befehle ausführen.

Nachdem Sie die Anwendung erstellt und erstellt haben, können Sie sie installieren, indem Sie das Befehlszeilenprogramm InstallUtil.exe ausführen und den Pfad zur ausführbaren Datei des Diensts übergeben. Anschließend können Sie den Dienststeuerungs-Manager verwenden, um Ihren Dienst zu starten, zu beenden, anzuhalten, fortzusetzen und zu konfigurieren. Sie können auch viele dieser Aufgaben im Dienstknoten im Server-Explorer oder mithilfe der ServiceController Klasse ausführen.

Dienstanwendungen im Vergleich zu anderen Visual Studio-Anwendungen

Dienstanwendungen funktionieren unterschiedlich von vielen anderen Projekttypen auf verschiedene Arten:

  • Die kompilierte ausführbare Datei, die ein Dienstanwendungsprojekt erstellt, muss auf dem Server installiert werden, bevor das Projekt sinnvoll funktionieren kann. Sie können eine Dienstanwendung nicht debuggen oder ausführen, indem Sie F5 oder F11 drücken; Sie können einen Dienst nicht sofort ausführen oder einen Schritt in seinen Code ausführen. Stattdessen müssen Sie Ihren Dienst installieren und starten und dann einen Debugger an den Prozess des Diensts anfügen. Weitere Informationen finden Sie unter How to: Debug Windows Service Applications.

  • Im Gegensatz zu einigen Projekttypen müssen Sie Installationskomponenten für Dienstanwendungen erstellen. Die Installationskomponenten installieren und registrieren den Dienst auf dem Server und erstellen einen Eintrag für Ihren Dienst mit dem Windows Services Control Manager. Weitere Informationen finden Sie unter Anleitung: Hinzufügen von Installern zu Ihrer Dienstanwendung.

  • Die Main Methode für Ihre Dienstanwendung muss den Befehl "Ausführen" für die dienste ausstellen, die Ihr Projekt enthält. Die Run Methode lädt die Dienste in den Dienststeuerungs-Manager auf dem entsprechenden Server. Wenn Sie die Windows Services-Projektvorlage verwenden, wird diese Methode automatisch für Sie geschrieben. Beachten Sie, dass das Laden eines Diensts nicht dasselbe ist wie das Starten des Diensts. Weitere Informationen finden Sie weiter unten unter "Dienstlebensdauer".

  • Windows-Dienstanwendungen werden in einer anderen Fensterstation als der interaktiven Station des angemeldeten Benutzers ausgeführt. Eine Windowstation ist ein sicheres Objekt, das eine Zwischenablage, einen Satz globaler Atome und eine Gruppe von Desktopobjekten enthält. Da es sich bei der Station des Windows-Diensts nicht um eine interaktive Station handelt, werden Dialogfelder, die aus einer Windows-Dienstanwendung ausgelöst werden, nicht angezeigt und können dazu führen, dass Ihr Programm nicht mehr reagiert. Ebenso sollten Fehlermeldungen im Windows-Ereignisprotokoll protokolliert werden, anstatt in der Benutzeroberfläche ausgelöst zu werden.

    Die vom .NET Framework unterstützten Windows-Dienstklassen unterstützen keine Interaktion mit interaktiven Stationen, d. h. dem angemeldeten Benutzer. .NET Framework enthält auch keine Klassen, die Stationen und Desktops darstellen. Wenn Ihr Windows-Dienst mit anderen Stationen interagieren muss, müssen Sie auf die nicht verwaltete Windows-API zugreifen. Weitere Informationen finden Sie in der Windows SDK-Dokumentation.

    Die Interaktion des Windows-Diensts mit dem Benutzer oder anderen Stationen muss sorgfältig so konzipiert sein, dass Szenarien einbezogen werden, z. B. dass kein Benutzer angemeldet ist oder der Benutzer einen unerwarteten Satz von Desktopobjekten hat. In einigen Fällen ist es möglicherweise besser geeignet, eine Windows-Anwendung zu schreiben, die unter der Kontrolle des Benutzers ausgeführt wird.

  • Windows-Dienstanwendungen werden in ihrem eigenen Sicherheitskontext ausgeführt und werden gestartet, bevor sich der Benutzer auf dem Windows-Computer anmeldet, auf dem sie installiert sind. Sie sollten sorgfältig planen, in welchem Benutzerkonto der Dienst ausgeführt werden soll; Ein Dienst, der unter dem Systemkonto ausgeführt wird, verfügt über mehr Berechtigungen und Berechtigungen als ein Benutzerkonto.

Dienstlebensdauer

Ein Dienst durchläuft in seiner Lebensdauer mehrere interne Zustände. Zuerst wird der Dienst auf dem System installiert, auf dem er ausgeführt wird. Dieser Prozess führt die Installationsprogramme für das Dienstprojekt aus und lädt den Dienst in den Dienststeuerungs-Manager für diesen Computer. Der Dienststeuerungs-Manager ist das zentrale Hilfsprogramm, das von Windows zum Verwalten von Diensten bereitgestellt wird.

Nachdem der Dienst geladen wurde, muss er gestartet werden. Wenn Sie den Dienst starten, kann er damit beginnen, zu funktionieren. Sie können einen Dienst über den Dienststeuerungs-Manager, über den Server-Explorer oder über Code starten, indem Sie die Start Methode aufrufen. Die Start Methode übergibt die Verarbeitung an die Methode der Anwendung OnStart und verarbeitet den code, den Sie dort definiert haben.

Ein ausgeführter Dienst kann in diesem Zustand unbegrenzt vorhanden sein, bis er beendet oder angehalten wird oder bis der Computer heruntergefahren wird. Ein Dienst kann in einem von drei grundlegenden Zuständen vorhanden sein: Running, , , Pausedoder Stopped. Der Dienst kann auch den Status eines ausstehenden Befehls melden: ContinuePending, , PausePending, , StartPendingoder StopPending. Diese Status geben an, dass ein Befehl ausgegeben wurde, z. B. ein Befehl zum Anhalten eines ausgeführten Diensts, aber noch nicht ausgeführt wurde. Sie können die Status Abfrage abfragen, um zu bestimmen, in welchem Zustand sich ein Dienst befindet, oder sie verwenden, WaitForStatus um eine Aktion auszuführen, wenn ein dieser Zustände auftritt.

Sie können einen Dienst aus dem Dienststeuerungs-Manager, vom Server-Explorer oder durch Aufrufen von Methoden im Code anhalten, beenden oder fortsetzen. Jede dieser Aktionen kann eine zugeordnete Prozedur im Dienst aufrufen (OnStop, OnPauseoder OnContinue), in der Sie zusätzliche Verarbeitung definieren können, die ausgeführt werden soll, wenn der Dienststatus geändert wird.

Arten von Diensten

Es gibt zwei Arten von Diensten, die Sie in Visual Studio mit .NET Framework erstellen können. Diensten, die der einzige Dienst in einem Prozess sind, werden dem Typ Win32OwnProcesszugewiesen. Dienste, die einen Prozess für einen anderen Dienst freigeben, werden dem Typ Win32ShareProcesszugewiesen. Sie können den Diensttyp abrufen, indem Sie die ServiceType Eigenschaft abfragen.

Es kann vorkommen, dass andere Diensttypen angezeigt werden, wenn Sie vorhandene Dienste abfragen, die in Visual Studio nicht erstellt wurden. Weitere Informationen dazu finden Sie unter ServiceType.

Dienste und die ServiceController-Komponente

Die ServiceController Komponente wird verwendet, um eine Verbindung mit einem installierten Dienst herzustellen und ihren Zustand zu bearbeiten. Mithilfe einer ServiceController Komponente können Sie einen Dienst starten und beenden, anhalten und die Funktion fortsetzen und benutzerdefinierte Befehle an einen Dienst senden. Sie müssen jedoch keine Komponente verwenden ServiceController , wenn Sie eine Dienstanwendung erstellen. In den meisten Fällen sollte Ihre ServiceController Komponente in einer separaten Anwendung von der Windows-Dienstanwendung vorhanden sein, die Ihren Dienst definiert.

Weitere Informationen finden Sie unter ServiceController.

Anforderungen

  • Dienste müssen in einem Windows-Dienstanwendungsprojekt oder einem anderen .NET-Framework-fähigen Projekt erstellt werden, das beim Erstellen eine .exe-Datei generiert und von der ServiceBase-Klasse erbt.

  • Projekte, die Windows-Dienste enthalten, müssen Über Installationskomponenten für das Projekt und seine Dienste verfügen. Dies kann einfach über das Eigenschaftenfenster erreicht werden. Weitere Informationen finden Sie unter Anleitung: Hinzufügen von Installern zu Ihrer Dienstanwendung.

Siehe auch