web-dev-qa-db-fra.com

Comment passer un paramètre à un service Windows une fois pour toutes lors de l'installation au lieu de chaque démarrage

Nous avons une application de service Windows pouvant accepter des paramètres de ligne de commande tels que: 

MyService -option 

Jusqu'à présent, lorsque nous voulons démarrer le service avec un paramètre, nous le faisons soit manuellement à partir de la boîte de dialogue Propriétés du service (dans la zone Paramètres de démarrage), soit à l'aide de la commande 

sc start MyService -option  

Ce que nous voudrions, c’est un moyen de installer le service "de manière permanente" avec ce paramètre , afin que les utilisateurs n’aient qu’à le démarrer/l’arrêter sans avoir à régler le paramètre à chaque fois .

Par ailleurs, l’ajout du paramètre dans l’entrée de registre ImagePath ne fonctionne pas, pas plus qu’une telle installation: 

MyService -option /install

Mise à jour : Merci pour les réponses fournies jusqu'à présent, qui m'aident à préciser la question.
Ce que j'aimerais réaliser, c'est définir le paramètre au niveau du service lui-même (comme pour les propriétés) s'il existe plus d'un service dans le même exécutable. L'option de configuration binpath met simplement à jour l'entrée ImagePath dans le registre. Cela ne peut pas être spécifique au service.

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

Mise à jour

Les paramètres de service individuels sont stockés dans le registre sous la clé HKLM\SYSTEM\CurrentControlSet\Services\<serviceName>\Parameters. Je ne suis pas sûr de savoir comment les paramètres sont transmis au service. Je crois SCM lit ces valeurs lorsqu'il appelle StartService il les transmet au ServiceMain callback. 

10
Remus Rusanu

Que diriez-vous de mettre le paramètre dans un fichier de configuration?

6
Raj More

Selon la documentation ServiceBase.OnStart :

Les arguments entrés dans la console ne sont pas enregistrés. ils sont transmis au service une fois au démarrage du service à partir du panneau de commande. Les arguments qui doivent être présents au démarrage automatique du service peuvent être placés dans la valeur de chaîne ImagePath de la clé de registre du service (HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services \). Vous pouvez obtenir les arguments du registre à l'aide de la méthode GetCommandLineArgs, par exemple: string [] imagePathArgs = Environment.GetCommandLineArgs () ;.

2
Rosberg Linhares

Les arguments transmis sur la ligne de commande via ImagePath sont accessibles dans main () ou via GetCommandLine (). Vous pouvez installer avec les arguments de ligne de commande, puis dans votre ServiceMain, vérifiez si des arguments ont été passés dans le paramètre lpszArgs. Sinon, appelez GetCommandLine et voyez si certains ont été transmis de cette façon.

1
Dustin

Powershell peut le faire, mais vous devez utiliser .Net pour y parvenir.

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

S'il existe plusieurs services avec le même exécutable, vous devez les installer avec des noms de services différents. Vous pouvez vous référer au nom du service au lieu des paramètres. 

Pour obtenir le nom du service, vous pouvez utiliser ceci Comment un service Windows peut-il déterminer son nom service?

0
timothy

Utilisez la commande SC (contrôle de service), elle vous offre bien plus d’options que simplement démarrer et arrêter.

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

La seule chose qui a fonctionné pour moi a été d'ajouter le paramètre à ImagePath dans le registre, comme dans l'image suivante:  enter image description here

0
gatsby