Error 193: no es una aplicación Win32 válida al iniciar un servicio de Windows

Si un servicio de Windows se inicia con el error 193 «No es una aplicación Win32 válida», generalmente se debe a espacios en el binpath, que sc.exe interpreta como argumentos separados. El artículo muestra la causa y tres soluciones prácticas.

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 archivo C:\Users\Fridolin es 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 mandamiento ren C:\Users\Fridolin C:\Users\Fridolin.txt.

    Si ya no lo necesitamos, también se puede eliminar simplemente con el comando del 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 comando md "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?

 

Aviso sobre Cookies en WordPress por Real Cookie Banner