Pregunta

Al crear un servicio de Windows usando:

sc create ServiceName binPath= "the path"

¿Cómo se puede pasar argumentos a la colección Context.Parameters de la clase de instalación?

Mi lectura de la documentación sc.exe es que tales argumentos sólo pueden ser transmitidos al final de binPath, pero no he encontrado un ejemplo o sido capaz de hacer esto con éxito.

¿Fue útil?

Solución

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

El truco es dejar un espacio después del = en su sentencia de creación, y también para el uso "" para cualquier cosa que contenga caracteres especiales o espacios.

Es aconsejable especificar un nombre para el servicio, así como el establecimiento de la configuración de inicio en automático para que se inicie automáticamente. Puede hacerlo especificando DisplayName= yourdisplayname y start= auto en su sentencia de creación.

Este es 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

Otros consejos

Parámetros para servicios creados tienen algún peculiar formatear cuestiones, en particular si el comando incluye espacios o comillas:

Si quiere introducir parámetros la línea de comandos para el servicio, hay que encerrar el línea de comandos toda entre comillas. (Y siempre dejar un espacio después binPath= y antes de la primera cita, como se señaló mrswadge)

Por lo tanto, para crear un servicio para el comando PATH\COMMAND.EXE --param1=xyz se usaría el siguiente parámetro binPath:

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

Si el ruta para el ejecutable contiene espacios , que tiene que incluir el ruta entre comillas.

Así que por un comando que tiene ambos Parámetros y un camino con espacios, es necesario citas anidadas . Usted tiene que escapar de las cotizaciones internas con barras invertidas \ ". Lo mismo se aplica si los parámetros contienen en sí mismas cotizaciones, tendrá que escapar de los mismos.

A pesar de utilizar barras inversas como caracteres de escape, que no tiene que escapar de las barras invertidas regulares contenidas en el camino. Esto es contrario a la forma en que se utiliza normalmente barras inversas como caracteres de escape.

Así que para un comando como
"PATH WITH SPACES \COMMAND.EXE" --param-with-quotes="a b c" --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í es un ejemplo concreto de la documentación 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 

(se añaden saltos de línea para mejorar la legibilidad, no incluirlos)

Esto añadiría un nuevo servicio con el "C:\Program Files\CollabNet Subversion Server\svnserve.exe" --service -r "C:\my repositories" línea de comandos.

Así que en resumen

  • espacio después de cada parámetro sc: binpath=_, displayname=_ y depend=_
  • sc cada parámetro que contiene espacios debe estar entre comillas
  • todas las cotizaciones adicionales dentro del binpath se escapó con barras invertidas: \ "
  • todas las barras invertidas en el interior del binpath no se escaparon
sc create "YOURSERVICENAME" binpath= "\"C:\Program Files (x86)\Microsoft SQL Server\MSSQL11\MSSQL\Binn\sqlservr.exe\" -sOPTIONALSWITCH" start= auto 

Vea aquí: la modificación de la "Ruta al ejecutable" de un servicio de windows

Me había problemas para conseguir que esto funcione en Windows 7. Se parecía ignorar el primer argumento pasé en lo que utiliza binPath= "C:\path\to\service.exe -bogusarg -realarg1 -realarg2" y ha funcionado.

Yo uso para simplemente crear sin parámetros, y luego editar el HKLM\System\CurrentControlSet\Services\[YourService] registro.

Este comando funciona:

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

Se toma también importante en cuenta cómo acceder a los argumentos en el código de la aplicación.

En mi C # aplicación que utiliza la clase ServiceBase:

 class MyService : ServiceBase
{

    protected override void OnStart(string[] args)
    {
       }
 }

Me he registrado mi servicio utilizando

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

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

documentación

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

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

class MyService : ServiceBase
 {

    protected override void OnStart(string[] args)
    {

                log.Info("arg1 == "+Environment.GetCommandLineArgs()[1]);

       }
 }

este imprimiría

       arg1 == arg1

He encontrado una manera de utilizar sc.

sc config binPath = "\" c: \ ruta con espacios en él \ service_executable.exe \" "

En otras palabras, el uso de \ para escapar de cualquier "'s se quiere sobrevivir el tránsito en el registro.

Asegúrese de tener cotizaciones al principio y al final de su valor binPath.

Yo no podía manejar el tema con sus propuestas, al final de la carpeta x86 sólo funcionaba en cáscara de alimentación (servidor Windows 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 ha intentado todo lo anterior y todavía no puede pasar argumentos a su servicio, si su servicio fue escrito en C / C ++, esto es lo que podría ser el problema: cuando se inicia el servicio a través de "sc arg2 arg1 inicio. .. ", Carolina del Sur llama a su servicio de función ServiceMain directamente con esos argumentos. Pero cuando Windows inicia su servicio (en el arranque, por ejemplo), que es la función principal de su servicio (tmain) que se llama, con parametros de "binPath" del registro.

Un ejemplo de creación de servicios de utilizar barras invertidas con muchas comillas dobles.

C:\Windows\system32>sc.exe create teagent binpath= "\"C:\Program Files\Tripwire\TE\Agent\bin\wrapper.exe\" -s \"C:\Program Files\Tripwire\TE\Agent\bin\agent.conf\"" DisplayName= "Tripwire Enterprise Agent"

[SC] CreateService SUCCESS
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top