2009-09-28 5 views
16

Wir haben einen Windows-Dienst-Anwendung, die Befehlszeilenparameter wie annehmen können:eines Parameters auf einen Windows-Dienst ein für alle Mal installieren, anstatt jeder passieren beginnen

MyService -option 

Bisher wenn wir wollen manuell aus dem Service-Eigenschaften-Dialog starten sie den Dienst mit einem Parameter, wir entweder es tun (im Feld Startparameter) oder mit dem Befehl

sc start MyService -option 

Was möchten wir eine Art und Weise zu den Dienst „dauerhaft“ installieren mit diesem Parameter , so dass die Benutzer nur starten/stoppen müssen, ohne den Parameter jedesmal setzen zu müssen.

BTW, Hinzufügen der Parameter in dem ImagePath-Registrierungseintrag funktioniert nicht, weder wie diese nicht installieren:

MyService -option /install 

Aktualisiert: Vielen Dank für die Antworten so weit, die mir die Frage verfeinern helfen.
Was ich erreichen möchte ist, den Parameter auf der Serviceebene selbst (wie mit den Eigenschaften) für den Fall, dass mehr als 1 Service in der gleichen ausführbaren Datei sind. Die Option binpath config aktualisiert lediglich den ImagePath-Eintrag in der Registrierung. Das kann nicht dienstspezifisch sein.

Antwort

10
sc config MyService binPath= MyService.exe -option 

aktualisieren

Die einzelnen Serviceparameter am Schlüssel HKLM\SYSTEM\CurrentControlSet\Services\<serviceName>\Parameters in der der Registry gespeichert werden. Ich bin mir nicht sicher, wie die Parameter an den Dienst übergeben werden. I glaube, SCM liest diese Werte dann, wenn es StartService ruft es übergibt sie an die ServiceMain Rückruf.

+0

Equivalent den ImagePath Registrierungseintrag zu bearbeiten. Nicht spezifisch für den Dienst selbst. Aber eine gute Möglichkeit, diesen Eintrag trotzdem zu verwalten, danke. –

+0

Guter Versuch, aber es scheint nicht zu funktionieren ... (zumindest nicht mit Eigenschaften oder sc Start) –

+0

StartService * übergibt als Argumente an ServiceMain, was auch immer im Bearbeitungsfeld "Argumente" der Diensteigenschaften aus den Diensten konfiguriert ist .msc snap in, das ist in der Spezifikation dokumentiert. Das sollte gut genug für dich sein, glaube ich. –

6

Wie wäre es, den Parameter in eine Konfigurationsdatei zu setzen?

+0

Würde nicht funktionieren, wenn Sie mehrere Dienste in der gleichen .exe hosten möchten, wie in Frage Update geklärt. Welche Konfigurationsdatei wählen Sie? – Timbo

1

Auf Argumente, die über ImagePath in der Befehlszeile übergeben werden, kann in main() oder über GetCommandLine() zugegriffen werden. Sie könnten mit Befehlsargumenten installieren und dann in Ihrem ServiceMain prüfen, ob im Parameter lpszArgs Argumente übergeben wurden. Ist dies nicht der Fall, rufen Sie GetCommandLine auf und prüfen Sie, ob auf diese Weise Daten übertragen wurden.

+0

Testen auf beiden Exe und Service-Ebene wäre eine Lösung für einen einzigen Service Exe. Aber es würde erfordern, den Dienst neu zu schreiben und würde auch nicht mit mehreren Diensten in derselben Exe funktionieren. –

+0

Ich denke, dass Remus 'Antwort über die Verwendung des Registrierungsschlüssels Parameter hier die einzige Option ist. Ich glaube nicht, dass es einen Weg gibt, Service-Parameter für Autostart-Dienste zu erhalten. – Dustin

0

Wenn es mehr als einen Dienst mit der gleichen ausführbaren Datei gibt, dann würden Sie sie mit verschiedenen Dienstnamen installieren. Sie könnten auf den Dienstnamen anstelle der Parameter verweisen.

dem Dienstnamen erhalten Sie diese How can a Windows Service determine its ServiceName?

1

Powershell kann diese nutzen können tun, aber Sie .Net verwenden müssen, um es zu erreichen.

new-Object System.ServiceProcess.ServiceController("$ServiceName",$ComputerName)).Start("$Parameter") 
0

Verwenden Sie den SC (Service Control) Befehl, es gibt Ihnen viel mehr Möglichkeiten als nur & starten oder stoppen.

DESCRIPTION: 
      SC is a command line program used for communicating with the 
      NT Service Controller and services. 
    USAGE: 
     sc <server> [command] [service name] ... 

     The option <server> has the form "\\ServerName" 
     Further, help on commands can be obtained by typing: "sc [command]" 
     Commands: 
     query-----------Queries the status for a service, or 
         enumerates the status for types of services. 
     queryex---------Queries the extended status for a service, or 
         enumerates the status for types of services. 
     start-----------Starts a service. 
     pause-----------Sends a PAUSE control request to a service. 
     interrogate-----Sends an INTERROGATE control request to a service. 
     continue--------Sends a CONTINUE control request to a service. 
     stop------------Sends a STOP request to a service. 
     config----------Changes the configuration of a service (persistent). 
     description-----Changes the description of a service. 
     failure---------Changes the actions taken by a service upon failure. 
     qc--------------Queries the configuration information for a service. 
     qdescription----Queries the description for a service. 
     qfailure--------Queries the actions taken by a service upon failure. 
     delete----------Deletes a service (from the registry). 
     create----------Creates a service. (adds it to the registry). 
     control---------Sends a control to a service. 
     sdshow----------Displays a service's security descriptor. 
     sdset-----------Sets a service's security descriptor. 
     GetDisplayName--Gets the DisplayName for a service. 
     GetKeyName------Gets the ServiceKeyName for a service. 
     EnumDepend------Enumerates Service Dependencies. 

     The following commands don't require a service name: 
     sc <server> <command> <option> 
     boot------------(ok | bad) Indicates whether the last boot should 
         be saved as the last-known-good boot configuration 
     Lock------------Locks the Service Database 
     QueryLock-------Queries the LockStatus for the SCManager Database 
    EXAMPLE: 
      sc start MyService 
2

Nach der ServiceBase.OnStart Dokumentation:

Die Argumente in der Konsole eingegeben werden nicht gespeichert; Sie werden einmalig an den Dienst übergeben, wenn der Dienst über das Bedienfeld gestartet wird. Argumente, die vorhanden sein müssen, wenn der Dienst automatisch gestartet wird, können in den ImagePath-Zeichenfolgenwert für den Registrierungsschlüssel des Diensts (HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \) eingefügt werden. Sie können die Argumente mithilfe der GetCommandLineArgs-Methode aus der Registrierung abrufen, zum Beispiel: string [] imagePathArgs = Environment.GetCommandLineArgs() ;.

+0

Ich habe es getestet, es wird keine Argumente von der Registrierung –

+1

@Desolator bekommen, in meinem Fall ist der Service-Name IISLogMonitor. Also änderte ich den Zeichenfolgenwert _HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ services \ IISLogMonitor \ ImagePath_ in _C: \ Programme \ IIS Log Monitor \ PowershellScriptAsService.exe "-LogName" IIS Log Monitor "-ScriptPath" C: \ Programme \ IIS Log Monitor \ IISLogMonitor.ps1 "_. Dann kann ich die Serviceargumente mit dem Code' string [] erhalten ServiceImagePathArgs = Environment.GetCommandLineArgs(); '. Was versuchst du zu tun? –

+0

Ja, du hast Recht. Ich habe leere Argumente, weil Wenn ich den Registrierungswert geändert habe, habe ich den Dienst deinstalliert und erneut installiert, sodass der Schlüsselwert zurückgesetzt wurde. –