Wer eine eigene Anwendung für Windows schreibt möchte diese vermutlich möglichst gut in Windows integrieren. Diese soll oft permanent im Hintergrund laufen. Dafür möchte man diese wahrscheinlich nicht einfach im Autostart ablegen oder einen Windows-Task im Task-Scheduler dafür nutzen. Ebenso will man den Benutzer den automatischen Start der Anwendung nicht selber regeln lassen. Man kann die Anwendung auch als richtigen Dienst im Betriebssystem registrieren (und auch wieder löschen).
Was sind Windows-Dienste?
Windows-Dienste sind eine der grundlegenden Komponenten des Microsoft-Betriebssystems. Ein Windows-Dienst ist eine Anwendung, die im Hintergrund arbeitet. Sie stellt bestimmte Funktionen bereit, die für den Betrieb des Systems oder anderer Anwendungen erforderlich sind. Diese Dienste arbeiten normalerweise ohne direkte Benutzerinteraktion und starten automatisch , wenn das Betriebssystem hochfährt.
Dienste kann man jedoch auch manuell starten, wenn eine Anwendung sie benötigt, während bestimmte Anwendungen oder Systemereignissen dafür nötige Dienste selber starten.
Einige Beispiele für Windows-Dienste sind der Druckspooler-Dienst, der für die Verwaltung des Druckens zuständig ist, der Windows-Audio-Dienst, der für die Wiedergabe von Audio-Dateien verantwortlich ist, und der Taskplaner-Dienst, der das Ausführen von Aufgaben zu einem bestimmten Zeitpunkt oder Ereignis ermöglicht. Ebenso gibt es aber auch Dienste von vielen anderen Programmen. Ein Beispiel ist ein installierter Apache der als Webserver immer läuft um Webseiten oder Webdienste bereitzustellen.
Wie funktionieren Windows-Dienste?
Windows-Dienste werden als separate Prozesse im Betriebssystem ausgeführt und verwenden das Windows-Dienstkontrollmanager-Modul (SCM) zur Verwaltung von Start, Stopp, Pause und Fortsetzen von Diensten. Das SCM wird beim Systemstart initialisiert und lädt die Konfigurationseinstellungen für jeden Dienst. Diese sind in der Windows-Registry gespeichert.
Windows-Dienste verwalten
Windows-Dienste können über das Windows-Dienstprogramm oder über die Befehlszeile verwaltet werden. Das Windows-Dienstprogramm ist ein Tool, das in der Systemsteuerung verfügbar ist und eine grafische Benutzeroberfläche zum Verwalten von Diensten bereitstellt. In der Liste der Dienste können Sie einen Dienst auswählen, um ihn zu starten, zu stoppen, zu pausieren oder fortzusetzen. Am einfachsten gelangt man dorthin indem man im Startmenü „Dienste“ oder „services“ eingibt.
Alternativ können Windows-Dienste über die Befehlszeile mit dem Befehl „sc“ (Service Control Manager) verwaltet werden. Mit dem Befehl „sc query“ können Sie alle verfügbaren Dienste auflisten, während „sc start“, „sc stop“, „sc pause“ und „sc continue“ zum Starten, Stoppen, Pausieren und Fortsetzen von Diensten verwendet werden können. Wie man Dienste mittels CMD oder PowerShell stoppen oder starten kann erfährst du in diesem Artikel.
In der Dienstverwaltung kann man einen Dienst nicht löschen oder anlegen, lediglich starten, stoppen, deaktivieren oder verschiedene andere Optionen für die Dienstausführung, wie das genutzte Benutzerkonto, festlegen.
Windows Dienst erstellen
Um einen Windows-Dienst zu löschen könnte man natürlich direkt in der Registry auf die Suche gehen und einfach den Eintrag des Programms löschen. Hierzu muss man unter folgendem Pfad nach dem gewünschten Programm suchen: „HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services“
Man könnte hierfür auch einen Befehl zum Editieren der Registry oder eine Reg-Datei erstellen, aber wozu wenn es dafür auch eigene Befehle zum Löschen und Erstellen des Windows-Dienstes gibt.
Windows Service erstellen mit PowerShell
1 2 3 4 5 6 |
<span class="hljs-pscommand">New-Service</span><span class="hljs-parameter"> -Name</span> ServiceName<span class="hljs-parameter"> -BinaryPathName</span> "C:\PfadZurExe\MyShittyProgram.exe" # Syntax New-Service [-Name] <string> [-BinaryPathName] <string> [-DisplayName <string>] [-Description <string>] [-StartupType {Automatic | Manual | Disabled | AutomaticDelayedStart | InvalidValue}] [-Credential <pscredential>] [-SecurityDescriptorSddl <string>] [-DependsOn <string[]>] [-WhatIf] [-Confirm] [<CommonParameters>] |
Einen bestehenden Service editieren kann man mit folgendem Befehl:
1 2 3 4 5 6 |
Set-Service -Name ServiceName ... # Syntax: Set-Service [-Name] <string> [-DisplayName <string>] [-Credential <pscredential>] [-Description <string>] [-StartupType {Automatic | Manual | Disabled | AutomaticDelayedStart | InvalidValue}] [-SecurityDescriptorSddl <string>] [-Status {Running | Stopped | Paused}] [-Force] [-PassThru] [-WhatIf] [-Confirm] [<CommonParameters>] |
Windows Service erstellen mit CMD
1 2 3 4 5 |
sc create ServiceName # Syntax sc.exe [<servername>] create [<servicename>] [type= {own | share | kernel | filesys | rec | interact type= {own | share}}] [start= {boot | system | auto | demand | disabled | delayed-auto}] [error= {normal | severe | critical | ignore}] [binpath= <binarypathname>] [group= <loadordergroup>] [tag= {yes | no}] [depend= <dependencies>] [obj= {<accountname> | <objectname>}] [displayname= <displayname>] [password= <password>] |
Windows Dienst löschen
Um einen Windows-Dienst zu löschen könnte man natürlich direkt in der Registry auf die Suche gehen und einfach den Eintrag des Programms löschen. Hierzu muss man unter folgendem Pfad nach dem gewünschten Programm suchen: „HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services“
Man könnte hierfür auch einen Befehl oder eine Reg-Datei erstellen, aber wozu wenn es dafür auch eigene Befehle zum Löschen und Erstellen des Windows-Dienstes gibt.
Windows Service löschen mit PowerShell
In PowerShell 6 oder 7 wurde ein einfacher Befehl zum Löschen von Windows-Diensten eingeführt:
1 |
Remove-Service -Name ServiceName |
In älteren PowerShell-Versionen gab es den Remove-Befehl leider noch nicht, weshalb man dort mit einem Umweg über ein WMI-Objekt den gewünschten Dienst löschen muss:
1 2 |
$service = Get-WmiObject -Class Win32_Service -Filter "Name='servicename'" $service.delete() |
Windows Service löschen mit CMD
1 2 |
net stop ServiceName sc delete ServiceName |
Ich habe einen Stopp des Dienstes vorangestellt. Ansonsten könnte der Löschbefehl mit folgender Meldung quittiert werden:
[SC] DeleteService FEHLER 1072:
Das wäre aber auch nicht schlimm, da der Dienst in diesem Fall zum Löschen markiert wurde und nach einem sowieso empfehlenswerten Neustart des Computers verschwindet.
Alternative Methode mit instsrv.exe
Es gibt auch noch eine andere Anwendung namens instsrv.exe (vermutlich steht das für „insall service“). Mit dieser kann man ebenfalls einen Service anlegen oder löschen:
1 2 3 4 5 |
rem create service instarv.exe ServiceName "C:\PfadZurExe\MyShittyProgram.exe" rem delete service instsrv.exe ServiceName remove |
Hierzu muss allerdings das „Windows NT Resource Kit“ heruntergeladen und installiert sein. Allerdings ist das zusätzliche Installieren schon aufwendiger als einfach die von Haus aus funktionierenden Befehle zu benutzen.
Dienste erstellen und löschen über GUI
Wer das ganze zu Testzwecken lieber per GUI macht findet in Windows direkt nichts dafür. Es gibt jedoch ein SysInternals-Tool von Microsoft selber, mit dem man Windows-Dienste verwalten kann. Dieses nennt sich „Autoruns“.