Wenn ein Dienst mit sc.exe Erstellung, wie in Zusammenhang Parameter zu übergeben?
-
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.
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
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=_
unddepend=_
- 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