Beliebige Windows-Programme als Dienst (Service) im Hintergrund laufen lassen
Idee
Manchmal wäre es nützlich, ein Windows-Programm im Hintergrund als Dienst (Service) laufen zu lassen, obwohl das Programm für die Ausführung auf dem Desktop oder für die Kommandozeile entwickelt wurde. Zwar kann dann kein GUI-Fenster angezeigt werden, dafür läuft die Anwendung auch wenn der Benutzer abgemeldet ist. Passende Anwendungen müssen natürlich in der Lage sein, selbständig ohne Benutzer-Interaktion zu arbeiten, nachdem die Einstellungen vorher entsprechend gesetzt wurden.
Wir werden dies hier mit dem Backup-Programm Live File Backup demonstrieren, das entwickelt wurde, um veränderte Arbeitsdateien laufend und versioniert zwischen den üblichen Vollbackups zu sichern. Obwohl es als Desktop-Anwendung konzipiert wurde, kann es so im Hintergrund laufen, auch wenn sich der Benutzer abgemeldet hat – z.B. wenn weiterhin auch Dateien anderer Benutzer oder externer Datenträger gesichert werden sollen.
Live File Backup wird normalerweise über ein Icon im Infobereich der Taskleiste (SysTray) gesteuert. Da dieses Icon, oder ein entsprechendes Fenster, bei der Ausführung als Service nicht vorhanden sein wird, muss folgendes beachtet werden:
- Für Konfigurationsänderungen muss der Service gestoppt und deinstalliert werden, dann für das Ändern der Einstellungen das Programm als Desktop-Anwendung ausgeführt und wieder beendet werden, um es dann als Service erneut zu installieren und zu starten. Wie Sie sehen werden, ist das leicht zu bewerkstelligen.
- Die Programm-Funktion, um die Anwendung direkt automatisch mit Windows zu starten, kann nicht verwendet werden, weil sonst zwei Instanzen des Programms zur gleichen Zeit laufen würden. Das ist aber kein Problem, weil ja dann die Anwendung sowieso als Dienst/Service mit Windows gestartet wird.
Vorgehen
Nun kommen wir zur Anwendung des kleinen aber genialen Windows-Tools, das fast jedes Desktop-Programm als Service im Hintergrund ausführen kann: Es heisst WinSW, Windows Service Wrapper und wurde von Kohsuke Kawaguchi, Oleg Nenashev und vielen anderen Mitwirkenden als Open Source entwickelt. Alle Details findet man auf GitHub unter: https://github.com/winsw/winsw .
Schritt 1: Betroffenes Desktop-Programm installieren und konfigurieren
Wir laden das Installationsprogramm für unsere Beispielanwendung Live File Backup herunter und führen es aus: https://www.livefilebackup.ch
Danach steht das Programm als Icon im Infobereich der Taskleiste (SysTray) zur Verfügung. Anschliessend setzen wir alle Programm-Einstellungen so, damit es als normales Desktop-Programm unseren Wünschen entsprechend funktioniert. Anleitung für Live File Backup als PDF-Dokument: https://www.livefilebackup.ch/public/LiveFileBackupDE.pdf
Natürlich kann dafür auch jedes andere Desktop- oder Kommandozeilen-Programm verwendet werden, das selbständig ohne Benutzer-Interaktion seine Arbeit verrichten kann.
Schritt 2: Das Tool WinSW installieren
Wir laden das Tool WinSW herunter und installieren es, die aktuellste Version zum Zeitpunkt dieses Blogs ist 2.11.0: https://github.com/winsw/winsw/releases/tag/v2.11.0
Wir benötigen das ausführbare Programm “WinSW-x64.exe” und die Konfigurationsdatei “sample-allOptions.xml”. Beide speichern wir in einem Verzeichnis wie beispielsweise “C:\WinSW”. Danach vergeben wir an beide Dateien einen beliebigen sinnvollen aber gleichen Namen, z.B. “LFBservice.exe” und “LFBservice.xml”.
Schritt 3: WinSW konfigurieren
WinSW wird über die XML-Datei konfiguriert; wir öffnen also “LFBservice.xml” in einem Texteditor wie Notepad. Die vollständige Dokumentation befindet sich unter: https://github.com/winsw/winsw/blob/v3/docs/xml-config-file.md
Die meisten Einstellungen in der vorliegenden Datei sind durch <!-- ... -->
auskommentiert, weil sie nicht benötigt werden. Für die folgenden relevanten Einträge entfernen wir die Auskommentierung und/oder passen die Einstellungen wie folgt an.
ID, Name und Beschreibung für den beabsichtigten Service:
<!-- ID of the service. It should be unique accross the Windows system-->
<id>LFBservice</id>
<!-- Display name of the service -->
<name>LFB Service</name>
<!-- Service description -->
<description>Live File Backup as a service</description>
Pfad zur Anwendung, die wir als Service installieren möchten:
<!-- Path to the executable, which should be started -->
<!-- <executable>%BASE%\myExecutable.exe</executable> -->
<executable>C:\Program Files (x86)\LiveFileBackup\LiveFileBackup.exe</executable>
Viele Desktop-Programme laufen nur unter dem Benutzerkonto, in dem sie installiert wurden:
(Alternativen sind LocalSystem, LocalService, NetworkService. Siehe oben erwähnte Dokumentation.)
<!--
OPTION: serviceaccount
Defines account, under which the service should run.
-->
<serviceaccount>
<domain>MyComputerName</domain>
<user>MyLoginName</user>
<password>MyLoginPassword</password>
<allowservicelogon>true</allowservicelogon>
</serviceaccount>
Neben diesen Einstellungen gibt es noch viele weitere interessante Optionen, die aber im Normalfall für die grundsätzliche Funktion nicht unbedingt notwendig sind.
Schritt 4: Dienst/Service installieren und starten
Nachdem wir die Einstellungen in der XML-Datei gespeichert haben, können wir nun den neuen Dienst/Service installieren und starten. Wir öffnen eine Eingabeaufforderung (Command-Prompt) oder ein PowerShell-Fenster, idealerwise mit Administrator-Rechten, damit die UAC nicht bei jedem Schritt Admin-Rechte anfordert.
In der Eingabeaufforderung wechseln wir in unser zuständiges Verzeichnis, wie beispielsweise “C:\WinSW”.
CD C:\WinSW
Mit folgendem Befehl erstellen wir den neuen Dienst/Service:
.\LFBservice install
Und starten anschliessend den neuen Dienst/Service:
.\LFBservice start
Von diesem Zeitpunkt an wird der neue Dienst, und damit unsere Anwendung, bei jedem Start von Windows ausgeführt.
Wenn wir die Anzeige der Windows-Dienste öffnen, können wir dort ebenfalls den neuen Dienst finden und kontrollieren.
Der Dienst kann mit folgenden Befehlen wieder gestopped und deinstalliert werden:
.\LFBservice stop
.\LFBservice uninstall
Wie bereits erwähnt, muss der Dienst für Änderungen an den Anwendungseinstellungen zunächst gestoppt und deinstalliert werden, und nach den Änderungen muss die Anwendung geschlossen, der Dienst neu installiert und wieder gestartet werden. Was aber mit obigen Befehlen einfach und schnell erledigt ist.
Fazit
Mit WinSW kann fast jedes selbständig arbeitende Programm in einen Hintergrund-Dienst/Service verwandelt werden, damit es auch dann läuft, wenn kein Benutzer angemeldet ist. Für mehr Details schauen Sie sich bitte unbedingt die oben erwähnte Dokumentation an.