Quando si crea un servizio con sc.exe come passare in parametri di contesto?

StackOverflow https://stackoverflow.com/questions/3663331

  •  01-10-2019
  •  | 
  •  

Domanda

Durante la creazione di un servizio di Windows utilizzando:

sc create ServiceName binPath= "the path"

come può argomentazioni essere passato alla raccolta Context.Parameters della classe di installazione?

La mia lettura della documentazione sc.exe è che tali argomenti potrebbero essere passati solo alla fine del binPath, ma non ho trovato un esempio o sono stati in grado di farlo con successo questo.

È stato utile?

Soluzione

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

Il trucco è quello di lasciare uno spazio dopo i = nella vostra dichiarazione di creare, e anche per l'uso "" per tutto ciò che contiene caratteri speciali o spazi.

Si consiglia di specificare un nome visualizzato per il servizio, nonché impostare l'impostazione di partenza per l'auto in modo che si avvia automaticamente. È possibile farlo specificando DisplayName= yourdisplayname e start= auto nell'istruzione creare.

Ecco un esempio:

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

Se questo ha lavorato si dovrebbe vedere:

[SC] CreateService SUCCESS

UPDATE 1

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

Altri suggerimenti

I parametri per i servizi creati hanno una qualche particolare formattazione problemi, in particolare se il comando include spazi o virgolette:

Se si vogliono impostare i parametri della riga di comando per il servizio, è necessario racchiudere il tutta la riga di comando tra virgolette. (E lasciare sempre uno spazio dopo binPath= e prima della prima citazione, come mrswadge sottolineato)

Quindi, per creare un servizio per il comando PATH\COMMAND.EXE --param1=xyz si può usare il seguente parametro binpath:

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

Se il path per il file eseguibile contiene spazi , si deve racchiudere il path tra virgolette.

Quindi, per un comando che ha sia parametri e un percorso con gli spazi, è necessario citazioni annidate . Dovete fuggire le quotazioni interne con backslash \ ". Lo stesso vale se i parametri stessi contengono citazioni, sarà necessario sfuggire quelli troppo.

Nonostante l'uso di barre rovesciate come caratteri di escape, non devi per sfuggire ai backslash regolari contenute nel percorso. Ciò è contrario a come si usa normalmente barre rovesciate come caratteri di escape.

Così, per un comando come
"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

Ecco un esempio concreto dalla documentazione svnserve, che mostra tutti i casi particolari:

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

(linebreaks sono aggiunti per migliorare la leggibilità, non includerli)

Questo dovrebbe aggiungere un nuovo servizio con la linea di comando "C:\Program Files\CollabNet Subversion Server\svnserve.exe" --service -r "C:\my repositories".

Quindi, in sintesi

  • spazio dopo ogni parametro SC: binpath=_, displayname=_ e depend=_
  • ogni parametro SC che contiene spazi deve essere racchiuso tra virgolette
  • tutte le citazioni supplementari all'interno del binpath sono cavata con backslash: \ "
  • tutte le barre rovesciate all'interno del binpath non sono sfuggiti
sc create "YOURSERVICENAME" binpath= "\"C:\Program Files (x86)\Microsoft SQL Server\MSSQL11\MSSQL\Binn\sqlservr.exe\" -sOPTIONALSWITCH" start= auto 

Vedere qui: Modifica del "Percorso eseguibile" di un servizio di Windows

Avevo problemi di ottenere questo al lavoro su Windows 7. Sembrava di ignorare il primo argomento ho passato in così ho usato binPath= "C:\path\to\service.exe -bogusarg -realarg1 -realarg2" e ha funzionato.

Io uso per creare solo senza parametri, e quindi modificare il Registro di sistema HKLM\System\CurrentControlSet\Services\[YourService].

Questo comando funziona:

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

E 'assunzione importante anche conto di come si accede Argomenti nel codice dell'applicazione.

Nella mia applicazione c # ho usato la classe ServiceBase:

 class MyService : ServiceBase
{

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

Ho registrato il mio servizio utilizzando

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

Ma non ho potuto accedere agli argomenti attraverso la variabile args quando l'eseguo come servizio.

documentazione

Il MSDN suggerisce di non utilizzare il metodo principale per recuperare gli argomenti binPath o ImagePath. Invece suggerisce di effettuare l'logica nel metodo OnStart e quindi utilizzando (C #) Environment.GetCommandLineArgs();.

Per accedere ai primi argomenti arg1 ho bisogno di fare in questo modo:

class MyService : ServiceBase
 {

    protected override void OnStart(string[] args)
    {

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

       }
 }

questo sarebbe stampare

       arg1 == arg1

Ho trovato un modo per utilizzare sc.

sc config binpath = "\" c: \ percorso con gli spazi in esso \ service_executable.exe \" "

In altre parole, l'uso \ per sfuggire qualsiasi "'s si vuole sopravvivere il transito nel Registro di sistema.

Assicuratevi di avere le virgolette all'inizio e alla fine del vostro valore binpath.

Non ho potuto gestire il problema con le vostre proposte, alla fine con il 86 cartella si lavorava solo in guscio di potenza (Windows Server 2012) utilizzando le variabili di ambiente:

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

Se si è tentato tutto quanto sopra e ancora non può passare args al vostro servizio, se il servizio è stato scritto in C / C ++, ecco quello che potrebbe essere il problema: quando si avvia il servizio attraverso "sc inizio arg1 arg2. .. ", SC chiama del vostro servizio funzione ServiceMain direttamente con questi argomenti. Ma quando Windows si avvia il servizio (in fase di avvio, per esempio), la sua funzione principale del servizio (tmain) che si chiama, con params da "binpath" del Registro di sistema.

Un esempio la creazione di servizi di utilizzare backslash con molte virgolette.

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top