msi - Cómo pasar un parámetro a un servicio de Windows de una vez por todas en la instalación en lugar de cada inicio
nt service installer (8)
Tenemos una aplicación de servicio de Windows que puede aceptar parámetros de línea de comandos como:
MyService -option
Hasta ahora, cuando queremos iniciar el servicio con un parámetro, lo hacemos manualmente desde el cuadro de diálogo Propiedades del servicio (en el cuadro Parámetros de inicio) o con el comando
sc start MyService -option
Lo que nos gustaría es una forma de instalar el servicio "de forma permanente" con este parámetro , para que los usuarios solo tengan que iniciarlo / detenerlo sin tener que configurar el parámetro cada vez .
Por cierto, agregar el parámetro en la entrada de registro de ImagePath no funciona, ni tampoco la instalación de esta manera:
MyService -option /install
Actualizado : gracias por las respuestas hasta el momento que me ayudan a refinar la pregunta.
Lo que me gustaría lograr es establecer el parámetro en el nivel de Servicio (como con las propiedades) en caso de que haya más de 1 servicio en el mismo ejecutable. La opción de configuración binpath simplemente está actualizando la entrada ImagePath en el registro. Eso no puede ser específico del servicio.
¿Qué hay de poner el parámetro en un archivo de configuración?
Los argumentos pasados en la línea de comandos a través de ImagePath son accesibles en main () o a través de GetCommandLine (). Podría instalar con argumentos de línea de comando y luego en su ServiceMain, verifique si se pasaron algunos argumentos en el parámetro lpszArgs. Si no es así, llame a GetCommandLine y vea si alguna se pasó de esa manera.
Powershell puede hacer esto, pero tienes que usar .Net para lograrlo.
new-Object System.ServiceProcess.ServiceController("$ServiceName",$ComputerName)).Start("$Parameter")
Según la documentación de ServiceBase.OnStart :
Los argumentos introducidos en la consola no se guardan; se pasan al servicio una sola vez cuando el servicio se inicia desde el panel de control. Los argumentos que deben estar presentes cuando el servicio se inicia automáticamente se pueden colocar en el valor de la cadena ImagePath para la clave de registro del servicio (HKEY_LOCAL_MACHINE / SYSTEM / CurrentControlSet / Services /). Puede obtener los argumentos del registro utilizando el método GetCommandLineArgs, por ejemplo: string [] imagePathArgs = Environment.GetCommandLineArgs () ;.
Si hay más de un servicio con el mismo ejecutable, entonces los instalará con diferentes nombres de servicio. Podría referirse al nombre del servicio en lugar de a los parámetros.
Para obtener el nombre del servicio, puede usar esto. ¿Cómo puede un servicio de Windows determinar su Nombre de servicio ?
Use el comando SC (control de servicio), le ofrece muchas más opciones que solo iniciar y detener.
DESCRIPTION:
SC is a command line program used for communicating with the
NT Service Controller and services.
USAGE:
sc <server> [command] [service name] ...
The option <server> has the form "//ServerName"
Further, help on commands can be obtained by typing: "sc [command]"
Commands:
query-----------Queries the status for a service, or
enumerates the status for types of services.
queryex---------Queries the extended status for a service, or
enumerates the status for types of services.
start-----------Starts a service.
pause-----------Sends a PAUSE control request to a service.
interrogate-----Sends an INTERROGATE control request to a service.
continue--------Sends a CONTINUE control request to a service.
stop------------Sends a STOP request to a service.
config----------Changes the configuration of a service (persistent).
description-----Changes the description of a service.
failure---------Changes the actions taken by a service upon failure.
qc--------------Queries the configuration information for a service.
qdescription----Queries the description for a service.
qfailure--------Queries the actions taken by a service upon failure.
delete----------Deletes a service (from the registry).
create----------Creates a service. (adds it to the registry).
control---------Sends a control to a service.
sdshow----------Displays a service''s security descriptor.
sdset-----------Sets a service''s security descriptor.
GetDisplayName--Gets the DisplayName for a service.
GetKeyName------Gets the ServiceKeyName for a service.
EnumDepend------Enumerates Service Dependencies.
The following commands don''t require a service name:
sc <server> <command> <option>
boot------------(ok | bad) Indicates whether the last boot should
be saved as the last-known-good boot configuration
Lock------------Locks the Service Database
QueryLock-------Queries the LockStatus for the SCManager Database
EXAMPLE:
sc start MyService
sc config MyService binPath= MyService.exe -option
Actualizar
Los parámetros de servicio individuales se almacenan en el registro en la clave HKLM/SYSTEM/CurrentControlSet/Services/<serviceName>/Parameters
. No estoy seguro de cómo se pasan los parámetros al servicio. Creo que SCM lee estos valores y luego, cuando llama a StartService
, los pasa a la devolución de llamada ServiceMain
.