Softwareentwicklung

Fehler 193: keine zulässige Win32-Anwendung beim Start eines Windows-Dienstes

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 Datei C:\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 Befehl ren 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 Befehl del C:\Users\Fridolin

  • Möglichkeit C: Ein anderes Verzeichnis für das Speichern des Windows-Service wählen

    Meist ist das Benutzerverzeichnis (in unserem Fall C:\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. Beispielsweise C:\Projekte\Mein Windows-Service Dieses Verzeichnis erstellen wir mit dem Befehl md "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?

René Pöpperl

Seit 2010 arbeite ich als Softwareentwickler. Mein hauptsächlichen Interessen liegen in gut durchdachtem UI-Design und hoher Code-Qualität.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Consent Management Platform von Real Cookie Banner