ver servicio query programa nuevo instalar estado ejecutar desde create crear como comando windows-services

windows services - query - Al crear un servicio con sc.exe, ¿cómo pasar los parámetros de contexto?



sc windows 10 (11)

Asegúrese de tener comillas al comienzo y al final de su valor binPath.

Al crear un servicio de Windows usando:

sc create ServiceName binPath= "the path"

¿Cómo se pueden pasar los argumentos a la colección Context.Parameters de la clase Installer?

Mi lectura de la documentación de sc.exe es que tales argumentos solo pueden pasar al final de binPath , pero no he encontrado un ejemplo o no he podido hacerlo con éxito.


Encontré una manera de usar sc.

sc config binPath = "/" c: / path con espacios en it / service_executable.exe / ""

En otras palabras, use / para escapar de cualquier "" que desee para sobrevivir al tránsito al registro.


Este comando funciona:

sc create startSvn binPath= "/"C:/Subversion/bin/svnserve.exe/" --service -r /"C:/SVN_Repository/"" displayname= "MyServer" depend= tcpip start= auto


Los parámetros para los servicios creados tienen algunos problemas de formato peculiares, en particular si el comando incluye espacios o comillas:

Si desea ingresar parámetros de línea de comando para el servicio, debe incluir toda la línea de comando entre comillas. (Y siempre deje un espacio después de binPath= y antes de la primera cita, como señaló mrswadge)

Entonces, para crear un servicio para el comando PATH/COMMAND.EXE --param1=xyz usted usaría el siguiente parámetro binPath:

binPath= "PATH/COMMAND.EXE --param1=xyz" ^^ ^ || | space quote quote

Si la ruta al archivo ejecutable contiene espacios , debe adjuntar la ruta entre comillas.

Entonces, para un comando que tiene ambos parámetros y una ruta con espacios, necesita cotizaciones anidadas . Tienes que escapar de las comillas internas con barras diagonales inversas / " . Lo mismo ocurre si los parámetros contienen comillas, también tendrás que escapar de ellas.

A pesar de usar barras diagonales inversas como caracteres de escape, no tiene que escapar de las barras invertidas regulares que se encuentran en la ruta. Esto es contrario a la forma en que normalmente usa barras invertidas como caracteres de escape.

Entonces, para un comando como
"PATH WITH SPACES /COMMAND.EXE" --param-with-quotes="abc" --param2 :

binPath= "/"PATH WITH SPACES /COMMAND.EXE/" --param-with-quotes=/"a b c/" --param2" ^ ^ ^ ^ ^ ^ ^ | | | | | | | opening escaped regular escaped escaped closing quote quote backslash closing quotes quote for for in quote for for whole path path for path parameter whole command command

Aquí hay un ejemplo concreto de la documentación de SVNserve, que muestra todos los casos especiales:

sc create svnserve binpath= "/"C:/Program Files/CollabNet Subversion Server/svnserve.exe/" --service -r /"C:/my repositories/" " displayname= "Subversion Server" depend= Tcpip start= auto

(Los saltos de línea se agregan para la legibilidad, no los incluye)

Esto agregaría un nuevo servicio con la línea de comando "C:/Program Files/CollabNet Subversion Server/svnserve.exe" --service -r "C:/my repositories" .

Entonces en resumen

  • espacio después de cada parámetro SC: binpath=_ , displayname=_ y depend=_
  • cada parámetro SC que contiene espacios debe estar entre comillas
  • todas las comillas adicionales dentro de la ruta de acceso se escapan con barras diagonales inversas: / "
  • todas las barras invertidas dentro de la ruta de acceso no se escaparon

No pude manejar el problema con sus propuestas, al final con la carpeta x86 solo funcionó en power shell (windows server 2012) usando variables de entorno:

{sc.exe create svnserve binpath= "${env:programfiles(x86)}/subversion/bin/svnserve.exe --service -r C:/svnrepositories/" displayname= "Subversion Server" depend= Tcpip start= auto}


Si probaste todo lo anterior y aún no puedes pasar argumentos a tu servicio, si tu servicio fue escrito en C / C ++, este es el problema: cuando comiences tu servicio a través de "sc start arg1 arg2 ..." , SC llama a la función ServiceMain de su servicio directamente con esos argumentos. Pero cuando Windows inicia su servicio (en el momento del arranque, por ejemplo), se llama a la función principal (_tmain) de su servicio, con parámetros del "binPath" del registro.


También es importante tener en cuenta cómo accede a los Argumentos en el código de la aplicación.

En mi aplicación c # utilicé la clase ServiceBase:

class MyService : ServiceBase { protected override void OnStart(string[] args) { } }

Registré mi servicio usando

sc create myService binpath = "MeyService.exe arg1 arg2"

Pero no pude acceder a los argumentos a través de la variable args cuando lo ejecuto como un servicio.

La documentación de MSDN sugiere no utilizar el método principal para recuperar los argumentos binPath o ImagePath . En su lugar, sugiere ubicar su lógica en el método OnStart y luego usar (C #) Environment.GetCommandLineArgs(); .

Para acceder a los primeros argumentos arg1 tengo que hacer esto:

class MyService : ServiceBase { protected override void OnStart(string[] args) { log.Info("arg1 == "+Environment.GetCommandLineArgs()[1]); } }

esto se imprimiría

arg1 == arg1


Tuve problemas para que esto funcione en Windows 7. Parecía ignorar el primer argumento que transmití, así que utilicé binPath= "C:/path/to/service.exe -bogusarg -realarg1 -realarg2" y funcionó.


Utilizo simplemente crearlo sin parámetros y luego edito el registro HKLM/System/CurrentControlSet/Services/[YourService] .



sc create <servicename> binpath= "<pathtobinaryexecutable>" [option1] [option2] [optionN]

El truco es dejar un espacio después de = en tu declaración de creación, y también usar "" para cualquier cosa que contenga caracteres especiales o espacios.

Es aconsejable especificar un Nombre para mostrar para el servicio, así como establecer la configuración de inicio en automático para que se inicie automáticamente. Puede hacer esto especificando DisplayName= yourdisplayname y start= auto en su declaración de creación.

Aquí hay un ejemplo:

C:/Documents and Settings/Administrator> sc create asperacentral binPath= "C:/Program Files/Aspera/Enterprise Server/bin/Debug/asperacentral.exe" DisplayName= "Aspera Central" start= auto

Si esto funcionó, debería ver:

[SC] CreateService SUCCESS

ACTUALIZACIÓN 1

http://support.microsoft.com/kb/251192