Wenn beim Starten eines Windows-Services der Fehler 193 “Keine zulässige Win32-Anwendung” gemeldet wird, liegt es häufig daran, dass der Windows-Service-Manager den Dienst nicht finden kann. Dies wird durch die Art und Weise verursacht, wie der Windows-Service-Manager mit Kommandozeilenargumenten umgeht. Der Fehler 193 tritt u. a. dann auf, wenn ein Verzeichnisname ein Leerzeichen enthält (z. B. C:\Users\Fridolin Froehlich
) und in dem darüberliegenden Verzeichnis (C:\Users
) eine Datei vorhanden ist, deren Dateiname aus dem ersten Wort des Verzeichnisses besteht (z. B. “C:\Users\Fridolin”). Klingt kompliziert – daher machen wir ein Beispiel:
Beispiel:
Unser Benutzer heißt “Fridolin Froehlich” und sein Home-Verzeichnis lautet C:\Users\Fridolin Froehlich
Im Verzeichnis Users
liegt aber auch eine Datei namens Fridolin
Der erstellte Windows-Service liegt im Verzeichnis C:\Users\Fridolin Froehlich\Repositories\Mein Windows-Service\bin
Wir registrieren den Windows-Service in der PowerShell mit Administrator-Rechten mit dem Befehl:sc.exe create "Mein Windows-Service" binpath="C:\Users\Fridolin Froehlich\Repositories\Mein Windows-Service\bin\Mein Windows-Service.exe"
Daraufhin wird uns die Erstellung des Windows-Service bestätigt:
[SC] CreateService ERFOLG
WICHTIG: Diese Erfolgsmeldung ist keine Garantie dafür, dass der Service vom Windows Service-Manager auch tatsächlich gefunden und gestartet werden kann.
Versuchen wir nun den Service zu starten:
sc.exe start "Mein Windows-Service"
Prompt erhalten wir eine Fehlermeldung: [SC] StartService NICHT ERFOLGREICH, Fehler 193.
Fehler 193 – Die Ursache
Beim Erzeugen des Windows-Service haben wir zwar den binpath in Anführungszeichen gesetzt, aber Windows nimmt nur den Text innerhalb der Anführungszeichen um den binpath des Service festzulegen. Das sieht man, wenn man z. B. den Service-Manager aufruft (indem man z. B. in der Suche oder der Kommandozeile services.msc
eingibt) und sich dort die Details des Services ansieht. Dort sieht der Pfad wie folgt aus:
C:\Users\Fridolin Froehlich\Repositories\Mein Windows-Service\bin\Mein Windows-Service.exe
Es fehlen also die Anführungszeichen. Daher ist es auch verständlich das der Dienstemanager versucht die Datei C:\Users\Fridolin
zu finden und auszuführen. Denn bekanntermaßen werden Kommandozeilenargumente durch Leerzeichen getrennt und so sieht unser binpath für den Windows-Dienstemanager wie zwei(!) Argumente aus.
Wie löst man den Fehler 193 beim Starten eines Windows-Diensts?
- Möglichkeit A: Anführungszeichen im binpath hinzufügen
Dies ist die sauberste Lösung. Um den Fehler 193 beim Start eines Windows-Diensts zu vermeiden, muss man in den binpath escapte Anführungszeichen einsetzen:sc.exe create "Mein Windows-Service" binpath="\"C:\Users\Fridolin Froehlich\Repositories\Mein Windows-Service\bin\Mein Windows-Service.exe\""
Wichtig ist hierbei das backslash (\) vor den zusätzlichen Anführungszeichen.
- Möglichkeit B: Die Problem-Datei finden und umbenennen
In obigem Beispiel ist die DateiC:\Users\Fridolin
das Problem. Wenn wir die Datei noch brauchen, sollten wir sie einfach umbenennen. Hierbei genügt es, wenn wir die Datei mit einer Dateiendung versehen (z. B..txt
). Das geht zum Beispiel mit dem Befehlren C:\Users\Fridolin C:\Users\Fridolin.txt
.
Benötigen wir die Datei nicht mehr, können wir sie auch einfach löschen z. B. mit dem Befehldel C:\Users\Fridolin
- Möglichkeit C: Ein anderes Verzeichnis für das Speichern des Windows-Service wählen
Meist ist das Benutzerverzeichnis (in unserem FallC:\Users\Fridolin Froehlich
das Problem, da es meist aus mehreren Wörtern besteht (Vorname, Nachname). Wir müssen uns also ein Verzeichnis heraussuchen oder erstellen, das nicht innerhalb des Benutzerverzeichnisses liegt. BeispielsweiseC:\Projekte\Mein Windows-Service
Dieses Verzeichnis erstellen wir mit dem Befehlmd "C:\Projekte\Mein Windows-Service"
Anschließend kopieren wir unsere Service-Echse äh Service-Exe in dieses Verzeichnis:copy "C:\Users\Fridolin Froehlich\Repositories\Mein Windows-Service\bin\Mein Windows-Service.exe" "C:\Projekte\Mein Windows-Service\"
Was tun, wenn die Fehlermeldung kommt “Set-Content : Es wurde kein Positionsparameter gefunden, der das Argument “binpath=” akzeptiert.”?
Dieser Fehler tritt auf, wenn man in der PowerShell nur den Befehl sc
verwendet, anstatt sc.exe
Der Befehl sc
in der Windows-PowerShell startet das Cmdlet “Set-Content”. Das ist jedoch nicht das, was wir brauchen. Wir benötigen sc.exe
– ein Befehlszeilenprogramm für die Kommunikation mit dem Dienststeuerungs-Manager und mit den Windows-Diensten.
Quellen
How to: register service with SC command without losing quotes in binpath value
When creating a service with sc.exe how to pass in context parameters?