Al crear un servicio con sc.exe cómo pasar de parámetros de contexto?
-
01-10-2019 - |
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.
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
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 ??strong> para el ejecutable contiene espacios , que tiene que incluir el ruta ??em> 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=_
ydepend=_
- 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.
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