Si al iniciar un servicio de Windows aparece el error 193 «No es una aplicación Win32 válida», generalmente es porque el administrador de servicios de Windows no puede encontrar el servicio. Esto se debe a la forma en que el administrador de servicios de Windows maneja los argumentos de la línea de comandos. El error 193 sucede, entre otras cosas, si un nombre de carpeta contiene un espacio (por ejemplo, C:\Users\Fridolin Froehlich) y en el directorio superior (C:\Users) existe un archivo cuyo nombre coincide con la primera palabra del nombre de la carpeta (por ejemplo, «C:\Users\Fridolin»). Suena complicado, por eso vamos a mostrar un ejemplo:
Ejemplo:
Nuestro usuario se llama «Fridolin Froehlich» y su directorio home es C:\Users\Fridolin Froehlich
En el directorio Users también hay un archivo llamado Fridolin
El servicio de Windows creado se encuentra en el directorio C:\Users\Fridolin Froehlich\Repositories\Mein Windows-Service\bin
Registramos el servicio de Windows en PowerShell con derechos de administrador usando el siguiente comando:sc.exe create "Mein Windows-Service" binpath="C:\Users\Fridolin Froehlich\Repositories\Mein Windows-Service\bin\Mein Windows-Service.exe"
Luego se nos confirma la creación del servicio de Windows:
[SC] CreateService ÉXITO
IMPORTANTE: Este mensaje de éxito no es garantía de que el administrador de servicios de Windows realmente pueda encontrar e iniciar el servicio.
Ahora intentemos iniciar el servicio:
sc.exe start "Mein Windows-Service"
Recibimos inmediatamente un mensaje de error: [SC] StartService NO EXITOSO, error 193.
Error 193 – La causa
Al crear el servicio de Windows pusimos binpath entre comillas, pero Windows sólo toma el texto dentro de las comillas para definir el binpath del servicio. Eso se puede ver, por ejemplo, si abrimos el administrador de servicios (por ejemplo, buscando o escribiendo services.msc en la línea de comandos) y miramos los detalles del servicio. Allí la ruta se ve así:
C:\Users\Fridolin Froehlich\Repositories\Mein Windows-Service\bin\Mein Windows-Service.exe
Faltan las comillas. Por eso es comprensible que el administrador intente encontrar y ejecutar el archivo C:\Users\Fridolin. Porque, como es sabido, los argumentos de la línea de comandos se separan por espacios, así que nuestro binpath le parece al administrador de servicios de Windows como dos(!) argumentos.
¿Cómo se soluciona el error 193 al iniciar un servicio de Windows?
- Opción A: Añadir comillas en el binpath
Esta es la solución más limpia. Para evitar el error 193 al iniciar un servicio de Windows, se deben poner comillas escapadas en el binpath:\»sc.exe create "Mein Windows-Service" binpath="\»C:\Users\Fridolin Froehlich\Repositories\Mein Windows-Service\bin\Mein Windows-Service.exe"
Lo importante aquí es el backslash (\) antes de las comillas adicionales. - Opción B: Encontrar y renombrar el archivo problemático
En el ejemplo anterior, el archivoC:\Users\Fridolines el problema. Si necesitamos ese archivo, simplemente debemos renombrarlo. Es suficiente si le añadimos una extensión (por ejemplo.txt). Esto se puede hacer con el mandamientoren C:\Users\Fridolin C:\Users\Fridolin.txt.
Si ya no lo necesitamos, también se puede eliminar simplemente con el comandodel C:\Users\Fridolin - Opción C: Elegir otro directorio para guardar el servicio de Windows
Normalmente, la carpeta de usuario (en nuestro caso,C:\Users\Fridolin Froehlich) es el problema, pues suele tener más de una palabra (nombre, apellido). Por lo tanto, debemos elegir o crear una carpeta que no esté dentro del directorio de usuario. Por ejemplo,C:\Projekte\Mein Windows-Service. Esta carpeta la creamos con el comandomd "C:\Projekte\Mein Windows-Service"
Luego copiamos nuestro ejecutable del servicio ejem Service-Exe a ese directorio:copy "C:\Users\Fridolin Froehlich\Repositories\Mein Windows-Service\bin\Mein Windows-Service.exe" "C:\Projekte\Mein Windows-Service\"
¿Qué hacer si aparece el mensaje de error «Set-Content : No se encontró ningún parámetro de posición que acepte el argumento «binpath=»?
Este error ocurre si, en PowerShell, se usa solo el comando sc en vez de sc.exe.
El comando sc en PowerShell de Windows inicia el Cmdlet «Set-Content». Pero no es eso lo que necesitamos. Necesitamos sc.exe – un programa de línea de comandos para comunicarse con el administrador de control de servicios y con los servicios de Windows.
Fuentes
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?