2009-09-28 4 views
16

Abbiamo un'applicazione di servizio Windows in grado di accettare i parametri della riga di comando come:Come passare un parametro a un servizio di Windows una volta per tutte in fase di installazione invece di ogni avviamento

MyService -option 

Finora, quando vogliamo avviare il servizio con un parametro, ci sia farlo manualmente dalla finestra di dialogo Proprietà del servizio (nella casella parametri di avvio) oppure con il comando

sc start MyService -option 

Quello che vorremmo è un modo per installare il servizio "in modo permanente" con questo parametro , in modo che gli utenti dovessero semplicemente iniziare/arrestare lo senza dover impostare il parametro ogni volta.

BTW, aggiungendo il parametro nella voce del Registro ImagePath non funziona, neppure l'installazione di simile a questo:

MyService -option /install 

Aggiornato: Grazie per le risposte finora, che mi aiutano a perfezionare la domanda.
Quello che mi piacerebbe ottenere è impostare il parametro al livello di servizio (come con le proprietà) nel caso in cui ci siano più di 1 servizio nello stesso eseguibile. L'opzione di configurazione binpath sta semplicemente aggiornando la voce ImagePath nel registro. Questo non può essere specifico per il servizio.

risposta

10
sc config MyService binPath= MyService.exe -option 

Aggiornamento

I singoli parametri di servizio vengono memorizzati nel Registro di sistema nella chiave HKLM\SYSTEM\CurrentControlSet\Services\<serviceName>\Parameters. Non sono sicuro però di come i parametri vengono passati al servizio. I credo SCM legge questi valori quindi quando chiama StartService li passa al callback ServiceMain.

+0

Equivalente a modificare la voce del Registro ImagePath. Non specifico per il servizio stesso. Ma un buon modo per gestire quella voce comunque, grazie. –

+0

Buona prova, ma non sembra funzionare ... (almeno non come con le proprietà o sc start) –

+0

StartService * fa * passare come argomenti a ServiceMain qualsiasi cosa sia configurata nella casella di modifica 'Argomenti' Proprietà dei servizi dai servizi .msc esegue lo snap in, che è documentato nella specifica. Questo dovrebbe essere abbastanza buono per te, credo. –

6

Come mettere il parametro in un file di configurazione?

+0

Non funzionerebbe se si desidera ospitare più servizi nello stesso file .exe, come chiarito nell'aggiornamento della domanda. Quale file di configurazione scegli? – Timbo

1

Gli argomenti trasmessi sulla riga di comando tramite ImagePath sono accessibili in main() o tramite GetCommandLine(). È possibile eseguire l'installazione con argomenti della riga di comando e quindi nel ServiceMain, verificare se sono stati inoltrati argomenti nel parametro lpszArgs. In caso contrario, chiamare GetCommandLine e verificare se sono stati passati in questo modo.

+0

I test a livello di Exe e di servizio sarebbero una soluzione per un singolo servizio Exe. Ma richiederebbe riscrivere il servizio e non funzionerebbe anche con più servizi nello stesso Exe. –

+0

Penso che la risposta di Remus sull'utilizzo della chiave di registro Parameters sia la tua unica opzione qui. Non penso che ci sia un modo per far passare i parametri di servizio per i servizi di avvio automatico. – Dustin

0

Se esiste più di un servizio con lo stesso eseguibile, sarà necessario installarli con nomi di servizio diversi. È possibile fare riferimento al nome del servizio anziché ai parametri.

Per ottenere il nome del servizio è possibile utilizzare questo How can a Windows Service determine its ServiceName?

1

PowerShell può fare questo, ma è necessario utilizzare .Net per realizzarla.

new-Object System.ServiceProcess.ServiceController("$ServiceName",$ComputerName)).Start("$Parameter") 
0

Utilizzare il comando SC (controllo del servizio), ti dà molte più opzioni che appena iniziare & arresto.

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 
2

Secondo la documentazione ServiceBase.OnStart:

Gli argomenti inseriti nella console non vengono salvati; vengono passati al servizio una volta sola quando il servizio viene avviato dal pannello di controllo. Gli argomenti che devono essere presenti quando il servizio viene avviato automaticamente possono essere inseriti nel valore di stringa ImagePath per la chiave del Registro di sistema del servizio (HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \). È possibile ottenere gli argomenti dal registro utilizzando il metodo GetCommandLineArgs, ad esempio: string [] imagePathArgs = Environment.GetCommandLineArgs() ;.

+0

L'ho provato, non mi viene richiesto dal registro –

+1

@Desolator, nel mio caso il nome del servizio è IISLogMonitor. Così ho cambiato il valore stringa _HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ services \ IISLogMonitor \ ImagePath_ a _C: \ Programmi \ IIS Log Monitor \ PowershellScriptAsService.exe "-LogName" IIS Log Monitor "-ScriptPath" C: \ Programmi \ IIS Log Monitor \ IISLogMonitor.ps1 "_. Quindi posso ottenere gli argomenti del servizio con il codice' string [] serviceImagePathArgs = Environment.GetCommandLineArgs(); '. Che cosa stai cercando di fare? –

+0

Sì, hai ragione. quando ho modificato il valore di registro ho disinstallato il servizio e l'ho installato di nuovo, quindi ha ripristinato il valore della chiave. –

Problemi correlati