Lors de la création d'un service avec sc.exe Comment passer dans les paramètres de contexte?

lors de la création du service Windows en utilisant:

sc create ServiceName binPath= "the path"

comment les arguments peuvent-ils être passés dans le contexte de la classe Installer.Collecte de paramètres?

ma lecture de la documentation sc.exe est que de tels arguments ne pouvaient être transmis qu'à la fin de binPath , mais je n'ai pas trouvé d'exemple ou n'ai pas été capable de le faire avec succès.

120
demandé sur andrews 2010-09-08 02:54:07

11 réponses

sc create <servicename> binpath= "<pathtobinaryexecutable>" [option1] [option2] [optionN]

le truc est de laisser un espace après le = dans votre déclaration create, et aussi d'utiliser "" pour tout ce qui contient des caractères ou des espaces spéciaux.

Il est conseillé de spécifier un Nom d'Affichage pour le service ainsi que le réglage du paramètre de démarrage automatique de sorte qu'il démarre automatiquement. Vous pouvez le faire en spécifiant DisplayName= yourdisplayname et start= auto dans votre déclaration create.

voici un exemple:

C:\Documents and Settings\Administrator> sc create asperacentral 
binPath= "C:\Program Files\Aspera\Enterprise Server\bin\Debug\asperacentral.exe" 
DisplayName= "Aspera Central" 
start= auto

Si cela a fonctionné, vous devriez voir:

[SC] CreateService SUCCESS

UPDATE 1

http://support.microsoft.com/kb/251192

215
répondu Mhmd 2016-11-25 01:01:42

les paramètres pour les services créés ont des problèmes de formatage particuliers, en particulier si la commande inclut des espaces ou des guillemets:

si vous voulez entrer paramètres de ligne de commande pour le service, vous devez joindre le ligne de commande entière entre guillemets. (Et toujours laisser un espace après binPath= et avant la première citation, comme M. swadge l'a souligné)

donc, pour créer un service pour la commande PATH\COMMAND.EXE --param1=xyz vous utiliserez le paramètre binPath suivant:

binPath= "PATH\COMMAND.EXE --param1=xyz"
        ^^                             ^
        ||                             |
  space    quote                     quote

Si le chemin à l'exécutable contient des espaces, , vous devez joindre le chemin entre guillemets.

ainsi pour une commande qui a à la fois paramètres et un chemin avec des espaces, vous avez besoin guillemets imbriqués . Vous doivent échapper aux guillemets intérieurs avec des slashs arrière \ . La même chose vaut si les paramètres eux-mêmes contiennent des guillemets, vous aurez besoin d'échapper à ceux-ci aussi.

malgré l'utilisation des antislashs comme caractères d'évasion, vous n'avez pas à échapper aux antislashs réguliers contenus dans le chemin. Ceci est contraire à la façon dont vous utilisez normalement backslashes comme caractères d'évasion.

donc pour une commande comme

"PATH WITH SPACES \COMMAND.EXE" --param-with-quotes="a b c" --param2 :

binPath= "\"PATH WITH SPACES \COMMAND.EXE\" --param-with-quotes=\"a b c\" --param2"
         ^ ^                 ^           ^                      ^       ^         ^
         | |                 |           |                      |       |         | 
 opening     escaped      regular     escaped                    escaped       closing
   quote     quote       backslash    closing                    quotes          quote
     for     for            in         quote                      for              for
   whole     path          path       for path                  parameter        whole
 command                                                                       command

voici un exemple concret tiré de la documentation de SVNserve, qui montre tous les cas particuliers:

sc create svnserve 
   binpath= "\"C:\Program Files\CollabNet Subversion Server\svnserve.exe\" --service -r \"C:\my repositories\"  "
   displayname= "Subversion Server" depend= Tcpip start= auto 

(linebreaks ajoutés pour plus de lisibilité, ne pas les inclure)

ceci ajouterait un nouveau service avec la ligne de commande "C:\Program Files\CollabNet Subversion Server\svnserve.exe" --service -r "C:\my repositories" .

Donc, en résumé

  • espace après chaque sc paramètre: binpath=_ , displayname=_ et depend=_
  • chaque paramètre sc qui contient des espaces doit être entouré de guillemets
  • toutes les citations supplémentaires à l'intérieur du binpath sont échappées avec des antislashs: \"
  • tous les backslashs à l'intérieur du binpath ne sont pas échappés
117
répondu HugoRune 2014-12-01 22:45:08
sc create "YOURSERVICENAME" binpath= "\"C:\Program Files (x86)\Microsoft SQL Server\MSSQL11\MSSQL\Binn\sqlservr.exe\" -sOPTIONALSWITCH" start= auto 

voir ici: modifier le" chemin vers l'exécutable" d'un service windows

8
répondu imjustarah 2017-05-23 12:34:54

j'ai eu des problèmes pour faire fonctionner Windows 7. Il a semblé ignorer le premier argument que j'ai passé dans donc j'ai utilisé binPath= "C:\path\to\service.exe -bogusarg -realarg1 -realarg2" et il a fonctionné.

5
répondu Craig Carpenter 2012-01-02 06:45:23

- je utiliser pour créer sans paramètres, puis modifier le registre HKLM\System\CurrentControlSet\Services\[YourService] .

4
répondu Tony 2012-10-11 18:07:02

cette commande fonctionne:

sc create startSvn binPath= "\"C:\Subversion\bin\svnserve.exe\" --service -r \"C:\SVN_Repository\"" displayname= "MyServer" depend= tcpip start= auto
2
répondu user2535091 2015-01-27 11:46:22

il est également important de tenir compte de la façon dont vous accédez aux Arguments dans le code de la demande.

dans mon application c# j'ai utilisé la classe de base de service:

 class MyService : ServiceBase
{

    protected override void OnStart(string[] args)
    {
       }
 }

j'ai enregistré mon service en utilisant

sc create myService binpath= " MeyService.exe arg1 arg2 arg2 1519100920"

mais je ne pouvais pas accéder aux arguments à travers la variable args quand je l'exécutais comme un service.

la documentation du MSDN suggère de ne pas utiliser la méthode principale pour récupérer les arguments binPath ou ImagePath . Il suggère plutôt de placer votre logique dans la méthode OnStart et d'utiliser ensuite (C#) Environment.GetCommandLineArgs(); .

pour accéder aux premiers arguments arg1 je dois faire comme ceci:

class MyService : ServiceBase
 {

    protected override void OnStart(string[] args)
    {

                log.Info("arg1 == "+Environment.GetCommandLineArgs()[1]);

       }
 }

ce serait imprimé

       arg1 == arg1
1
répondu Panciz 2017-02-27 12:33:28

assurez-vous d'avoir des guillemets au début et à la fin de votre binPath.

0
répondu cripox 2010-09-07 23:30:02

j'ai trouvé un moyen d'utiliser sc.

sc config binPath= " \"c:\path avec des espaces dans it\service_executable.exe\ ""

en d'autres termes, utilisez \ pour échapper à tout" 's vous voulez survivre au transit dans le registre.

0
répondu Rem Onyshczak 2014-11-06 20:10:40

Je ne pouvais pas gérer le problème avec vos propositions, à la fin avec le dossier x86 il ne fonctionnait que dans power shell (Windows server 2012) en utilisant des variables d'environnement:

{sc.exe create svnserve binpath= "${env:programfiles(x86)}/subversion/bin/svnserve.exe --service -r C:/svnrepositories/"   displayname= "Subversion Server" depend= Tcpip start= auto}
0
répondu g0r1lla 2015-03-08 15:35:05

si vous avez essayé tout ce qui précède et ne pouvez toujours pas passer args à votre service, si votre service a été écrit en C/C++, voici ce qui pourrait être le problème: lorsque vous commencez votre service par" sc start arg1 arg2...", SC appelle la fonction principale de votre service directement avec ces arg. Mais lorsque Windows démarre votre service (au démarrage, par exemple), c'est la fonction principale de votre service (_tmain) qui s'appelle, avec les paramètres de "binPath"du registre.

0
répondu BlueRiver 2016-12-25 07:43:35