Beim Erstellen eines Windows-Dienstes mit:
sc create ServiceName binPath= "the path"
Wie können Argumente an die Context.Parameters-Auflistung der Installer-Klasse übergeben werden?
Ich habe die sc.exe
Dokumentation gelesen und binPath
festgestellt, dass solche Argumente erst am Ende von übergeben werden konnten , aber ich habe kein Beispiel gefunden oder konnte dies erfolgreich tun.
windows-services
sympatric greg
quelle
quelle
binPath= "c:\abc\def.exe /Param1=ghi"
scheinen also die richtige Idee zu sein. Müssen die Backslashes maskiert werden (dh "c: \\ abc \\ ...")? Das Schlimmste ist, dass Sie den Registrierungswert anschließend direkt bearbeiten können, wenn SC.EXE dies nicht kann.Antworten:
Der Trick besteht darin, ein Leerzeichen nach dem = in Ihrer create-Anweisung zu lassen und "" für alles zu verwenden, das Sonderzeichen oder Leerzeichen enthält.
Es ist ratsam, einen Anzeigenamen für den Dienst anzugeben und die Starteinstellung auf automatisch zu setzen, damit er automatisch gestartet wird. Sie können dies tun, indem Sie
DisplayName= yourdisplayname
undstart= auto
in Ihrer create-Anweisung angeben.Hier ist ein Beispiel:
Wenn dies funktioniert hat, sollten Sie sehen:
UPDATE 1
http://support.microsoft.com/kb/251192
quelle
binPath= "C:\..."
) vorhanden sein muss , da dies sonst nicht funktioniert.start= auto
ist wichtig, daher wird der Dienst nach dem Neustart automatisch gestartet. Sehr gut für den Fall, dass der Endbenutzer kein Experte istbinPath
Anführungszeichen übergeben müssen, müssen diese\"
c:\some long path\some.exe "first argument"
binPath= "\"c:\some long path\some.exe\" \"first argument\""
binPath= ...
undDisplayName= ...
; in meinem Fall habe ich das "=" nach DisplayName vergessen), druckt die Konsole die Verwendungsanweisungen für dencreate
Befehl. wie:DESCRIPTION: Creates a service entry... USAGE: sc <server> create....
etcParameter für erstellte Dienste weisen einige besondere Formatierungsprobleme auf, insbesondere wenn der Befehl Leerzeichen oder Anführungszeichen enthält:
Wenn Sie Befehlszeilenparameter für den Dienst eingeben möchten , müssen Sie die gesamte Befehlszeile in Anführungszeichen setzen. (Und lassen Sie nach
binPath=
und vor dem ersten Zitat immer ein Leerzeichen , wie Frau Wadge betonte)PATH\COMMAND.EXE --param1=xyz
Um einen Dienst für den Befehl zu erstellen, verwenden Sie den folgenden binPath-Parameter:Wenn der Pfad zur ausführbaren Datei Leerzeichen enthält , müssen Sie den Pfad in Anführungszeichen setzen.
Für einen Befehl, der sowohl Parameter als auch einen Pfad mit Leerzeichen enthält, benötigen Sie verschachtelte Anführungszeichen . Sie müssen den inneren Anführungszeichen mit Backslashes entkommen\" . Das Gleiche gilt, wenn die Parameter selbst Anführungszeichen enthalten, müssen Sie diese ebenfalls umgehen.
Obwohl Sie Backslashes als Escape-Zeichen verwenden, müssen Sie sich nicht den regulären Backslashes im Pfad entziehen. Dies steht im Widerspruch dazu, wie Sie normalerweise Backslashes als Escape-Zeichen verwenden.
Also für einen Befehl wie
"PATH WITH SPACES \COMMAND.EXE" --param-with-quotes="a b c" --param2
:Hier ist ein konkretes Beispiel aus der SVNserve-Dokumentation, die alle Sonderfälle zeigt:
(Zeilenumbrüche werden zur besseren Lesbarkeit hinzugefügt, schließen Sie sie nicht ein.)
Dies würde einen neuen Dienst mit der Befehlszeile hinzufügen
"C:\Program Files\CollabNet Subversion Server\svnserve.exe" --service -r "C:\my repositories"
.Also zusammenfassend
binpath=_
,displayname=_
unddepend=_
quelle
binPath= "myservice.exe
. Der Befehlszeileninterpreter muss dies erwarten und verlangen, dass der Befehl durch Verwendung von Leerzeichen als Trennzeichen tokenisiert wird.Siehe hier: Ändern des "Pfads zur ausführbaren Datei" eines Windows-Dienstes
quelle
Ich hatte Probleme damit, dass dies unter Windows 7 funktioniert. Es schien das erste Argument zu ignorieren, das ich eingegeben habe, also habe ich es verwendet
binPath= "C:\path\to\service.exe -bogusarg -realarg1 -realarg2"
und es hat funktioniert.quelle
Ich erstelle es einfach ohne Parameter und bearbeite dann die Registrierung
HKLM\System\CurrentControlSet\Services\[YourService]
.quelle
Dieser Befehl funktioniert:
quelle
Es ist auch wichtig zu berücksichtigen, wie Sie auf die Argumente im Code der Anwendung zugreifen.
In meiner c # -Anwendung habe ich die ServiceBase-Klasse verwendet:
Ich habe meinen Dienst mit registriert
sc create myService binpath = "MeyService.exe arg1 arg2"
Ich konnte jedoch nicht über die
args
Variable auf die Argumente zugreifen , wenn ich sie als Dienst ausführte.Die MSDN - Dokumentation schlägt vor , mit der Main - Methode nicht abrufen
binPath
oderImagePath
Argumente. Stattdessen wird vorgeschlagen, Ihre Logik in dieOnStart
Methode einzufügen und dann (C #) zu verwendenEnvironment.GetCommandLineArgs();
.Um auf die ersten Argumente zuzugreifen, muss
arg1
ich Folgendes tun:das würde drucken
quelle
Ich habe einen Weg gefunden, sc zu benutzen.
sc config binPath = "" c: \ Pfad mit Leerzeichen \ service_executable.exe "
Mit anderen Worten, verwenden Sie \, um alle "'s zu umgehen, die Sie den Transit in die Registrierung überleben möchten.
quelle
Ein Beispiel für die Erstellung von Diensten zur Verwendung von Backslashes mit vielen doppelten Anführungszeichen.
quelle
Stellen Sie sicher, dass am Anfang und am Ende Ihres binPath-Werts Anführungszeichen stehen.
quelle
Ich konnte das Problem mit Ihren Vorschlägen nicht lösen. Am Ende funktionierte der x86-Ordner nur in der Power Shell (Windows Server 2012) mithilfe von Umgebungsvariablen:
quelle
Wenn Sie alle oben genannten Versuche unternommen haben und weiterhin keine Argumente an Ihren Dienst übergeben können und Ihr Dienst in C / C ++ geschrieben wurde, kann dies das folgende Problem sein: Wenn Sie Ihren Dienst über "sc start arg1 arg2 ..." starten , SC ruft die ServiceMain-Funktion Ihres Dienstes direkt mit diesen Argumenten auf. Wenn Windows Ihren Dienst startet (z. B. beim Booten), wird die Hauptfunktion Ihres Dienstes (_tmain) mit Parametern aus dem "binPath" der Registrierung aufgerufen.
quelle
Es funktioniert nicht in der Powershell und sollte in meinem Fall CMD verwenden
quelle