Wenn ein Dienst mit sc.exe Erstellung, wie in Zusammenhang Parameter zu übergeben?

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

  •  01-10-2019
  •  | 
  •  

Frage

Beim Erstellen von Windows-Dienst mit:

sc create ServiceName binPath= "the path"

Wie können Argumente, um die Installer Klasse Context.Parameters Sammlung übergeben werden?

Meine Lesart der sc.exe Dokumentation ist, dass solche Argumente nur am Ende des binPath weitergegeben werden können, aber ich habe festgestellt, kein Beispiel oder in der Lage gewesen, dies erfolgreich zu tun.

War es hilfreich?

Lösung

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

Der Trick ist, einen Raum nach dem = in Ihrer erstellen Aussage zu verlassen, und auch der Verwendung von „“ für alles, was mit Sonderzeichen oder Leerzeichen.

Es ist ratsam, einen Anzeigenamen für den Service sowie die Einstellung der Starteinstellung auf Auto angeben, so dass es automatisch gestartet wird. Sie können dies tun, indem DisplayName= yourdisplayname und start= auto in Ihrer erstellen Anweisung angeben.

Hier ist ein Beispiel:

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

Wenn dies funktioniert, sollten Sie sehen:

[SC] CreateService SUCCESS

UPDATE 1

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

Andere Tipps

Parameter für die erstellten Services haben einige eigenartige Fragen Formating, insbesondere, wenn der Befehl Leerzeichen oder Anführungszeichen enthalten:

Wenn Sie eingeben möchten Kommandozeilenparameter für den Dienst, haben Sie die ganze Befehlszeile in Anführungszeichen setzen. (Und immer einen Platz nach binPath= verlassen und vor dem ersten Zitat, wie mrswadge wies darauf hin)

Also, um einen Dienst für den Befehl PATH\COMMAND.EXE --param1=xyz zu erstellen würden Sie den folgenden binPath Parameter verwenden:

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

Wenn Sie die Pfad , um die ausführbare Datei Leerzeichen enthält , haben Sie die Pfad umschließen in Anführungszeichen.

Also für einen Befehl, der hat beide Parameter und ein Pfad mit Leerzeichen, müssen Sie verschachtelte Anführungszeichen . Sie haben die inneren Anführungszeichen mit einem Backslash \ " zu entkommen. Das gleiche gilt, wenn die Parameter selbst Anführungszeichen enthalten, müssen Sie diese natürlich auch zu entkommen.

Trotz Schrägstriche als Escape-Zeichen verwenden, müssen Sie nicht die regulären Schrägstriche in dem Pfad enthalten entkommen. Dies steht im Gegensatz zu, wie Sie normalerweise Schrägstriche als Escape-Zeichen verwendet werden.

Also für einen Befehl wie
"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

Hier ist ein konkretes Beispiel aus der Svnserve Dokumentation, die alle Sonderfälle zeigen:

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

(Zeilenumbrüche werden zur besseren Lesbarkeit hinzugefügt, beinhalten sie nicht)

Dies würde einen neuen Dienst mit der Befehlszeile "C:\Program Files\CollabNet Subversion Server\svnserve.exe" --service -r "C:\my repositories" hinzuzufügen.

So zusammenfassend

  • Raum nach jedem sc Parameter: binpath=_, displayname=_ und depend=_
  • jeder sc Parameter, die Leerzeichen enthält, muss in Anführungszeichen gesetzt werden
  • alle weiteren Zitate innerhalb des binpath sind mit Schrägstriche entkommen: \ "
  • alle Schrägstriche innerhalb des binpath nicht entgangen
sc create "YOURSERVICENAME" binpath= "\"C:\Program Files (x86)\Microsoft SQL Server\MSSQL11\MSSQL\Binn\sqlservr.exe\" -sOPTIONALSWITCH" start= auto 

Siehe hier: Ändern des „Pfad zur ausführbaren Datei“ von ein Windows-Dienst

ich Probleme habe dies unter Windows an der Arbeit 7. Es scheint das erste Argument zu ignorieren wir in übergeben, so habe ich binPath= "C:\path\to\service.exe -bogusarg -realarg1 -realarg2" und es hat funktioniert.

Ich verwende erstellen, ohne Parameter, und dann die Registrierung HKLM\System\CurrentControlSet\Services\[YourService] bearbeiten.

Dieser Befehl funktioniert:

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

Es ist auch wichtig Mitnahmen in Betracht ziehen, wie Sie die Argumente in dem Code der Anwendung zugreifen.

In meiner c # Anwendung ich die Servicebase-Klasse verwendet:

 class MyService : ServiceBase
{

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

ich registrierte meinen Dienst mit

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

Aber ich kann nicht die Argumente durch die args Variable zugreifen, wenn ich es als Dienst ausgeführt.

Die MSDN-Dokumentation schlägt vor, nicht das Hauptverfahren unter Verwendung der binPath oder ImagePath Argumente abzurufen. Stattdessen schlägt er vor, Ihre Logik in der OnStart Methode platzieren und dann mit (C #) Environment.GetCommandLineArgs();.

Für den Zugriff auf die ersten Argumente arg1 ich so tun müssen:

class MyService : ServiceBase
 {

    protected override void OnStart(string[] args)
    {

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

       }
 }

Dies würde drucken

       arg1 == arg1

Ich fand einen Weg, um den Einsatz sc.

sc config-binPath = "\" c: \ Pfad mit Leerzeichen in ihm \ service_executable.exe \“„

Mit anderen Worten, die Verwendung \ zu entkommen any „'s Sie wollen den Transit in die Registry, um zu überleben.

Seien Sie sicher, Anführungszeichen am Anfang und Ende Ihres binPath Wert haben.

Ich konnte nicht das Problem mit Ihren Vorschlägen behandelt, am Ende mit der x86-Ordner, um es nur an der Macht Shell (Windows Server 2012) unter Verwendung von Umgebungsvariablen gearbeitet:

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

Wenn Sie alle die versuchen, oben und noch nicht args zu Ihren Diensten passieren kann, wenn der Service in C / C ++ geschrieben worden, hier ist es, was das Problem sein könnte: Wenn Sie Ihren Dienst durch „sc Start arg1 arg2 starten. .. ", ruft SC Ihres Service Servicemain Funktion direkt mit diesem args. Aber wenn Windows Ihren Dienst starten (beim Booten, zum Beispiel), es ist Ihr Service Hauptfunktion (_tmain), die mit params aus der Registrierung der „binPath“ genannt wird.

Ein Service-Erstellung Beispiel Schrägstriche mit vielen doppelten Anführungszeichen.

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top