Comment passer un paramètre à un service windows une fois pour toutes à l'installation plutôt qu'à chaque démarrage
nous avons une application de service Windows qui peut accepter des paramètres de ligne de commande comme:
MyService -option
jusqu'à présent, lorsque nous voulons lancer 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épart), soit avec la commande
sc start MyService -option
ce que nous voulons est un moyen de installez le service "en permanence" avec ce paramètre, afin que les utilisateurs ont juste à démarrer / arrêter sans avoir pour définir le paramètre à chaque fois.
BTW, ajouter le paramètre dans L'entrée du registre ImagePath ne fonctionne pas, pas plus que d'installer comme ceci:
MyService -option /install
mise à Jour: Merci pour les réponses qui m'aident à affiner la question.
Ce que j'aimerais accomplir est de mettre le paramètre à l' niveau de Service lui-même (comme avec les propriétés) dans le cas où il y a plus d'un service dans le même exécutable. Le binpath l'option config ne fait que mettre à jour L'entrée ImagePath dans le registre. Cela ne peut pas être spécifique au service.
8 réponses
sc config MyService binPath= MyService.exe -option
mise à Jour
Le service paramètres sont stockés dans le registre à la clé HKLM\SYSTEM\CurrentControlSet\Services\<serviceName>\Parameters
. Je ne sais pas comment les paramètres sont transmis au service. J' croire SCM lit ces valeurs puis quand il appelle StartService
il passe à l' ServiceMain
rappel.
Selon ServiceBase.OnStart documentation
les arguments entrés dans la console ne sont pas sauvegardés; ils sont transmis au service une seule fois lorsque le service est démarré à partir du panneau de configuration. Les Arguments qui doivent être présents lorsque le service est lancé automatiquement peuvent être placés dans la chaîne de caractères ImagePath pour la clé de registre du service (HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\). Vous pouvez obtenir les arguments de le registre utilisant la méthode GetCommandLineArgs, par exemple: string[] imagePathArgs = Environment.GetCommandLineArgs ();.
les Arguments passés en ligne de commande via ImagePath sont accessibles en main() ou via GetCommandLine(). Vous pouvez installer avec la ligne de commande args et ensuite dans votre ServiceMain, vérifier si des arguments ont été passés dans le paramètre lpszArgs. Si ce n'est pas le cas, appelez GetCommandLine et voyez s'il y en a eu qui ont été passés par là.
Powershell peut le faire, mais vous devez utiliser .Net pour l'atteindre.
new-Object System.ServiceProcess.ServiceController("$ServiceName",$ComputerName)).Start("$Parameter")
S'il y a plus d'un service avec le même exécutable, alors vous les installerez avec des noms de service différents. Vous pouvez consulter le 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 de service?
Utilisez la commande SC (service control), elle vous donne beaucoup plus d'options que juste start & stop.
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
Si vous souhaitez passer des paramètres lors de votre démarrage du service automatiquement, cela peut aider: https://stackoverflow.com/a/41319479/4521055