Zum Inhalt springen

Der Fehler 193 „Keine zulässige Win32-Anwendung“ kann beim Start eines Windows-Dienstes auftreten. Was dieser Fehler bedeutet und wie Du ihn beheben kannst, erkläre ich in diesem Artikel.

Fehler 193 – in Kürze

Wenn beim Starten eines Windows-Services der Fehler 193 „Keine zulässige Win32-Anwendung“ gemeldet wird, liegt es häufig daran, dass der entsprechende Windows-Dienst nicht korrekt im Windows-Service-Manager eingetragen wurde. Um das besser zu verstehen, musst Du wissen, was einen Windows-Service von einem normalen Windows-Programm unterscheidet.

Windows-Service – was ist das genau?

Ein Windows-Service ist nicht einfach ein normales Windowsprogramm, das Du per Mausklick startest. Ein Windows-Service ist ein Programm das im Hintergrund läuft und kein User-Interface (Benutzeroberfläche) hat. Wenn so ein Windows-Service läuft, siehst Du auf dem Monitor nichts davon.

Um diese sogenannten Windows-Dienste starten und stoppen zu können, gibt es den Windows-Service-Manager. Diesen erreichst Du, wenn du im Suchfeld der Taskbar „services.msc“ eingibst. In Deutsch heisst diese Service-Manager-Programm einfach „Dienste“.

Damit ein Programm als Windows-Dienst laufen kann, muss es beim Dienste-Programm eingetragen werden. Das geschieht zum Beispiel mit Hilfe des Kommandozeilen-Tools „sc.exe“.

Fehler 193 – die Ursache

Wie kommt es jetzt aber zu dem Fehler 193 „Keine zulässige Win32-Anwendung“? Der Windows-Service-Manager hat eine „spezielle“ Art mit Kommandozeilenargumenten umzugehen. 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:

„Keine zulässige Win32-Anwendung“ – Beispiel:

Angenommen dein Windows-Benutzer heißt „Fridolin Froehlich“ und sein Home-Verzeichnis lautet C:\Users\Fridolin Froehlich

Im Verzeichnis C:\Users liegt aber auch eine Datei namens Fridolin

Angenommen, der Windows-Service, den Du registrieren möchtest liegt im Verzeichnis C:\Users\Fridolin Froehlich\Repositories\Mein Windows-Service\bin

Du registrierst 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

Das sieht ja erstmal gut aus. Wir hatten den binpath mit doppelten Anführungszeichen umschlossen, da ja Leerzeichen enthalten sind, und sc.exe konnte den Service scheinbar erfolgreich anlegen.

WICHTIG: Diese Erfolgsmeldung ist keine Garantie dafür, dass der Service vom Windows Service-Manager auch tatsächlich gefunden und gestartet werden kann.

Wenn wir Du nun versuchst den Service zu starten geht es schief:

sc.exe start "Mein Windows-Service"

[SC] StartService NICHT ERFOLGREICH, Fehler 193.

Um das zu verstehen, musst Du wissen, wie der Dienste-Manager mit dem Argument binpath umgeht.

Der Windows-Dienste-Manager und seine Kommandozeilenargumente … 🤯😫

Beim Erzeugen des Windows-Service hast Du zwar den binpath in Anführungszeichen gesetzt, aber Windows nimmt nur den Text innerhalb der Anführungszeichen um den binpath des Service festzulegen. Das siehst Du, wenn Du den Service-Manager aufrufst (in der Taskleisten-Suche oder der Kommandozeile services.msc eingeben) und dir dort die Details des Services ansieht. Suche in der Liste einfach nach dem Service „Mein Windows-Service“ und klicke doppelt darauf. In dem kleinen Fenster gibt es die Angabe „Pfad zur Exe-Datei“. Dort sieht der Pfad so aus:

C:\Users\Fridolin Froehlich\Repositories\Mein Windows-Service\bin\Mein Windows-Service.exe

Die Anführungszeichen fehlen, obwohl wir auf der Kommandozeile Anführungszeichen verwendet haben 🤦‍♂️. Das meine ich mit „der Windows-Dienste-Manager verwendet nur den Text innerhalb der Anführungszeichen„.

Also gut. Jetzt sieht unser binpath also aus wie oben. Toll. Wenn der Windows-Dienste-Manager den Dienst starten möchte, schickt er den Befehl C:\Users\Fridolin Froehlich\Repositories\Mein Windows-Service\bin\Mein Windows-Service.exe an den Befehlsprozessor. Dieser geht mit dem Befehl so um, als wäre er auf der Kommandozeile eingegeben worden. Leerzeichen auf der Kommandozeile funktionieren wie Trennzeichen. Zwischen dem Programm, das Du aufrufen möchtest und den Kommandozeilenargumenten muss z. B. ein Leerzeichen stehen. Und wenn Du mehrere Kommandozeilenargumente angibst, müssen diese ebenfalls mit Leerzeichen getrennt werden.

Wie versteht unser Befehlsprozessor also den Aufruf des Windows-Services? Der Befehlsprozessor „denkt“ so:

  1. Das Programm C:\Users\Fridolin aufrufen.
  2. Erstes Argument: Froehlich\Repositories\Mein
  3. Zweites Argument: Windows-Service\bin\Mein
  4. Drittes Argument: Windows-Service.exe

Der Befehlsprozessor versucht demnach die Datei C:\Users\Fridolin zu finden und auszuführen. Wenn diese Datei vorhanden ist, aber kein Windows-Programm ist, kommt es zu Fehler 193 „Keine zulässige Win32-Anwendung“. Verständlich …

Wie löst man den Fehler 193?

  • 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, musst Du 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 Du die Datei noch brauchst, solltest Du sie einfach umbenennen. Es genügt, wenn Du dieser Datei eine neue Dateiendung gibst (z. B. .txt). Das geht zum Beispiel mit dem Befehl ren C:\Users\Fridolin C:\Users\Fridolin.txt.

    Benötigst Du die Datei nicht mehr, kannst Du sie auch einfach löschen z. B. mit dem Befehl del C:\Users\Fridolin

    Aber: Bleibt das Problem mit dem Leerzeichen als Trenner nicht bestehen? Interessanterweise nicht. Da es dann die Datei C:\Users\Fridolin
    nicht mehr gibt, versucht der Befehlsprozessor auch nicht mehr sie aufzurufen. Stattdessen ignoriert er dann die Leerzeichen und kann den Windows-Dienst starten 🤦‍♂️ 🤷‍♂️
  • 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\"

Fehler: „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?

Schreibe einen Kommentar

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

WordPress Cookie Hinweis von Real Cookie Banner