So starten Sie einen Dienst mit bestimmten Startparametern unter Windows

17

Wie starte ich einen Dienst mit bestimmten Parametern? In einer anderen Frage habe ich gefunden

net start servicename blah

aber wenn ich das versuche, netwirft mir ein syntaxfehler zu.

Was mache ich falsch?

Bearbeiten: Zur Klärungnet start servicenamefunktioniert ganz gut, aber ich muss Parameter an den Dienst übergeben. Ich kann dies manuell tun,services.mscindemichvor dem Starten des Dienstes einen Startparameter eingebe. Aber wie kann ich das aus einem Skript heraus machen?

Noch eine Änderung: Sorry, aber meine Frage war irreführend . In meinen Tests hatte ich viel mehr Parameter und es ist nicht das,/blah net startworüberich michbeschwere. In der Tat ist alles , was mit einem Schrägstrich beginnt, in Ordnung . Funktioniert alsonet start servicename /blah,net start servicename blahfunktioniert nicht. Da ich brauchenet start servicename /foo bar,barist das das Problem.

sbi
quelle

Antworten:

29
sc start fooservice arg1 arg2 ...
Grawity
quelle
Ich habe keine Ahnung, wie ich es damals geschafft habe, Ihre Antwort zu verpassen, aber ich bin mit Sicherheit sehr froh, dass ich sie jetzt (aus Versehen) gefunden habe. Dies funktioniert wie ein Zauber - auch bei Parametern, die nicht mit anfangen /. Danke vielmals!
sbi
Es ist 2018 und in Windows 10 scheint weder "sc start ..." noch "net start ..." zu funktionieren. Das Bearbeiten der Registrierung funktioniert. Serverfault.com/questions/507561/…
MarcH
8

NET STARTIch bin der Meinung, dass Sie nach meinem Kenntnisstand keine willkürlichen Parameter übergeben können (anscheinend muss ihnen ein / vorangestellt werden). Der richtige Weg besteht darin, den entsprechenden Registrierungsschlüssel zu ändern und den Dienst zu stoppen / starten. Angenommen, Ihr benutzerdefinierter Dienst heißt MyService:

[HKLM\SYSTEM\CurrentControlSet\Services\MyService]
"ImagePath":C:\Projects\MyService\bin\MyService.exe Parameter1 Parameter2

In Wirklichkeit ist es jedoch besser, Ihre Konfiguration an einem Ort zu speichern, über den der Dienst Bescheid weiß, z. B. in der Registrierung oder im Dateisystem, und alle erforderlichen Werte zu lesen. Wie Sie sehen, ist das Anpassen der Befehlszeile etwas schmerzhafter als es sein sollte.

Wenn dies zufällig ein von .NET entwickelter Dienst ist, können Sie n Kopien der ausführbaren Datei auf Ihrem Dateisystem erstellen und diese automatisch aus der entsprechenden Datei app.config abrufen.

Es hört sich so an, als wären Sie möglicherweise zu weit außerhalb der Win32-Box gegangen. Da dies nach kundenspezifischer Entwicklung klingt, funktioniert jede der anderen angebotenen Lösungen, auch wenn dies möglicherweise nicht Ihr Ideal ist, ordnungsgemäß und ist ein sichererer Weg.

Goyuix
quelle
Pfui. Der Dienst benötigt eine Konfigurationsdatei. Es wird entweder ein Standarddateiname verwendet oder ein Name übergeben. Da zwei verschiedene Instanzen des Dienstes ausgeführt werden müssen, muss ich sie auf verschiedene Konfigurationsdateien verweisen. Mit der Registrierung herumspielen zu müssen, scheint ein sehr hässlicher Hack zu sein. Gibt es wirklich keinen anderen Weg als den (und die GUI)?
sbi
Goyuix, siehe meine bearbeitete Frage. net start nicht akzeptieren Parameter, sondern nur mit einem diejenigen beginnen /.
sbi
Goyuix benutze ich jetzt sc.exe. Siehe grawitys Antwort (die ich damals irgendwie übersehen habe).
sbi
4

Bei der Verwendung müssen Sie vor jedem Parameter einen Schrägstrich setzen net start. Stellen Sie außerdem sicher, dass Sie Parameter mit Leerzeichen angeben.

net start servicename /param0 /"param1 with spaces" /"/param2_has_slash"
Sogar Mien
quelle
Schau dir nochmal mein Problem an. Ich habe Parameter, die auch mit einem Schrägstrich beginnen (müssen). Wie würde ich die dann bestehen?
sbi
Versuchen Sie Folgendes: net start servicename / "/ foo" / bar
Even Mien
3

net start servicename /foo für ein einziges Argument

net start servicename /"foo bar" für eine Zeichenfolge oder eine Liste von Argumenten

Hinweis : Diese Frage ist 8 Jahre alt, aber ich habe nicht den Ruf, die akzeptierte Antwort zu kommentieren, und dies ist immer noch ein Top-Google-Ergebnis im Jahr 2018, daher wollte ich klären, was jetzt in Bezug auf die endgültige Bearbeitung der Fragen funktioniert.

MissingL_tter
quelle
Hinweis: Ich habe Ihnen eine positive Bewertung gegeben, daher befindet sich Ihre Antwort jetzt auf Platz 4, und Sie haben eine gewisse Wiederholungsschwäche. Viel Spaß hier! :-)
sbi
1

Sie müssen den tatsächlichen Dienstnamen verwenden, der in der Systemsteuerung unter Dienste angezeigt wird. Wenn es Leerzeichen enthält, müssen Sie den Dienstnamen in Anführungszeichen setzen.

Um den tatsächlichen Dienstnamen zu erhalten, geben Sie einfach net startohne Parameter an der Eingabeaufforderung ein. Es sollte eine Liste aller ausgeführten Dienste enthalten, damit Sie den tatsächlichen Dienstnamen abrufen können. Dann nutzen Sie einfachnet start <servicename>

Robert Williams
quelle
Robert, es ist ein Dienst von mir, den ich installiere und dann in einem Skript starte. Mir geht es net start "my-service-name"gut. Es net start "my-service-name" /blahgibt mir eine Fehlermeldung. Ich habe es auch versucht net start "my-service-name" -blahund dies ist auch ein Syntaxfehler.
sbi
0

Könnten InstSrv und SrvAny dabei helfen? Führer und Links

Dave M
quelle
Ich habe es kurz angeschaut und glaube nicht. (Bitte korrigieren Sie mich, wenn ich falsch liege.) Ich habe eine echte ausführbare Dienstdatei, die einwandfrei funktioniert. Es ist nur so, dass ich es (für Tests) über ein Skript installieren und starten muss und Parameter an den Service übergeben muss.
sbi