Si, lors du démarrage d’un service Windows, l’erreur 193 « Application Win32 non valide » est signalée, c’est souvent parce que le gestionnaire de services Windows ne parvient pas à trouver le service. Ceci est causé par la façon dont le gestionnaire de services Windows gère les arguments de la ligne de commande. L’erreur 193 survient notamment lorsqu’un nom de dossier contient un espace (par exemple C:\Users\Fridolin Froehlich) et qu’il existe, dans le dossier parent (C:\Users), un fichier dont le nom correspond au premier mot du dossier (par exemple « C:\Users\Fridolin »). Cela paraît compliqué – prenons donc un exemple :
Exemple :
Notre utilisateur s’appelle « Fridolin Froehlich » et son dossier personnel est C:\Users\Fridolin Froehlich
Dans le dossier Users se trouve aussi un fichier nommé Fridolin
Le service Windows créé se trouve dans le dossier C:\Users\Fridolin Froehlich\Repositories\Mein Windows-Service\bin
Nous enregistrons le service Windows dans PowerShell avec les droits administrateur à l’aide de la commande :sc.exe create "Mein Windows-Service" binpath="C:\Users\Fridolin Froehlich\Repositories\Mein Windows-Service\bin\Mein Windows-Service.exe"
La création du service Windows nous est alors confirmée :
[SC] CreateService SUCCÈS
IMPORTANT : Ce message de succès n’est pas une garantie que le service pourra effectivement être trouvé et démarré par le gestionnaire de services Windows.
Essayons maintenant de démarrer le service :
sc.exe start "Mein Windows-Service"
Immédiatement, nous obtenons un message d’erreur : [SC] StartService ÉCHEC, erreur 193.
Erreur 193 – La cause
Lors de la création du service Windows, nous avons certes mis le binpath entre guillemets, mais Windows ne retient que le texte à l’intérieur des guillemets pour définir le binpath du service. On peut le voir en ouvrant le gestionnaire de services (en lançant par exemple services.msc dans la recherche ou dans la console), et en regardant les détails du service. Le chemin y apparaît ainsi :
C:\Users\Fridolin Froehlich\Repositories\Mein Windows-Service\bin\Mein Windows-Service.exe
Les guillemets sont donc absents. Il est donc compréhensible que le gestionnaire de services tente de trouver et d’exécuter le fichier C:\Users\Fridolin. En effet, il est bien connu que les arguments en ligne de commande sont séparés par des espaces, et notre binpath est alors interprété par le gestionnaire de services comme deux(!) arguments.
Comment résoudre l’erreur 193 au démarrage d’un service Windows ?
- Option A : Ajouter des guillemets dans le binpath
C’est la solution la plus propre. Pour éviter l’erreur 193 au démarrage d’un service Windows, il faut placer des guillemets échappés dans le binpath :\ »sc.exe create "Mein Windows-Service" binpath="\ »C:\Users\Fridolin Froehlich\Repositories\Mein Windows-Service\bin\Mein Windows-Service.exe"
L’important ici est le backslash (\) devant les guillemets supplémentaires. - Option B : Trouver et renommer le fichier problématique
Dans l’exemple ci-dessus, le fichierC:\Users\Fridolinest en cause. Si nous avons encore besoin de ce fichier, il suffit de le renommer, par exemple, en lui ajoutant une extension (comme.txt). Cela se fait avec la commanderen C:\Users\Fridolin C:\Users\Fridolin.txt.
Si nous n’avons plus besoin du fichier, nous pouvons simplement le supprimer avec la commandedel C:\Users\Fridolin - Option C : Choisir un autre dossier pour stocker le service Windows
Souvent, le dossier utilisateur (dans notre casC:\Users\Fridolin Froehlich) pose problème car il se compose généralement de plusieurs mots (prénom, nom). Il faut donc choisir ou créer un dossier hors du dossier utilisateur, par exempleC:\Projekte\Mein Windows-Service. Ce dossier peut être créé avec la commandemd "C:\Projekte\Mein Windows-Service"
Ensuite, nous copions notre exécutable du service (oups) dans ce dossier :copy "C:\Users\Fridolin Froehlich\Repositories\Mein Windows-Service\bin\Mein Windows-Service.exe" "C:\Projekte\Mein Windows-Service\"
Que faire si le message d’erreur « Set-Content : aucun paramètre de position n’a été trouvé pour accepter l’argument « binpath= » » s’affiche ?<\/h2>
Cette erreur apparaît lorsque, dans PowerShell, on utilise simplement la commande sc au lieu de sc.exe.
La commande sc dans Windows PowerShell lance le Cmdlet « Set-Content », ce qui n’est pas ce dont nous avons besoin. Il faut impérativement utiliser sc.exe : c’est un programme de ligne de commande pour la communication avec le gestionnaire de contrôle de service et avec les services Windows.
Sources
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?