it-swarm.com.de

So geben Sie einen Parameter bei der Installation ein für alle Mal an einen Windows-Dienst und nicht bei jedem Start weiter

Wir haben eine Windows-Dienstanwendung, die Befehlszeilenparameter akzeptieren kann: 

MyService -option 

Wenn wir den Dienst mit einem Parameter starten möchten, tun wir dies entweder manuell im Dialogfeld "Diensteigenschaften" (im Feld Startparameter) oder mit dem Befehl 

sc start MyService -option  

Was wir möchten, ist ein Weg zu Installieren des Dienstes "permanent" mit diesem Parameter, so dass die Benutzer einfach starten/stoppen, ohne den Parameter jedes Mal neu einstellen zu müssen .

Übrigens, das Hinzufügen des Parameters in den ImagePath-Registrierungseintrag funktioniert nicht, und die Installation funktioniert auch nicht so: 

MyService -option /install

Aktualisiert: Vielen Dank für die bisherigen Antworten, die mir helfen, die Frage zu präzisieren.
Was ich erreichen möchte, ist die Einstellung des Parameters auf Serviceebene selbst (wie bei den Eigenschaften) für den Fall, dass mehr als ein Dienst in derselben ausführbaren Datei enthalten ist. Die binpath-Konfigurationsoption aktualisiert lediglich den ImagePath-Eintrag in der Registrierung. Das kann nicht dienstspezifisch sein.

18
François
sc config MyService binPath= MyService.exe -option

Update

Die einzelnen Dienstparameter werden in der Registrierung unter dem Schlüssel HKLM\SYSTEM\CurrentControlSet\Services\<serviceName>\Parameters gespeichert. Ich bin nicht sicher, wie die Parameter an den Dienst übergeben werden. Ich glaube SCM liest diese Werte dann, wenn sie StartService aufruft und sie an die ServiceMain callback übergibt. 

10
Remus Rusanu

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

6
Raj More

Gemäß der ServiceBase.OnStart Dokumentation:

Die in der Konsole eingegebenen Argumente 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 im ImagePath-Zeichenfolgenwert für den Registrierungsschlüssel des Diensts (HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services \) angegeben werden. Sie können die Argumente mithilfe der GetCommandLineArgs-Methode aus der Registrierung abrufen. Beispiel: string [] imagePathArgs = Environment.GetCommandLineArgs () ;.

2

Argumente, die in der Befehlszeile über ImagePath übergeben werden, sind über main () oder über GetCommandLine () zugänglich. Sie könnten die Installation mit Befehlszeilenargen durchführen und dann in Ihrem ServiceMain prüfen, ob Argumente im Parameter lpszArgs übergeben wurden. Wenn dies nicht der Fall ist, rufen Sie GetCommandLine an und prüfen Sie, ob auf diese Weise übergeben wurde.

1
Dustin

Powershell kann dies, aber Sie müssen .Net verwenden, um dies zu erreichen.

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

Wenn es mehr als einen Dienst mit derselben ausführbaren Datei gibt, würden Sie sie mit unterschiedlichen Dienstnamen installieren. Sie können statt der Parameter auf den Dienstnamen verweisen. 

Um den Dienstnamen zu erhalten, können Sie diesen Verwenden. Wie kann ein Windows-Dienst seinen Dienstnamen ermitteln?

0
timothy

Mit dem Befehl SC (Dienststeuerung) haben Sie weit mehr Möglichkeiten als nur Start und Stopp.

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
0
Tejas Bagade

Das einzige, was für mich funktionierte, war das Hinzufügen des Parameters zu ImagePath in der Registrierung wie das folgende Bild:  enter image description here

0
gatsby