186 votes

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

Lors de la création d'un service Windows en utilisant :

sc create ServiceName binPath= "the path"

comment transmettre des arguments à la collection Context.Parameters de la classe Installer ?

Ma lecture de la sc.exe est que de tels arguments ne peuvent être passés qu'à la fin d'un processus d'évaluation. binPath mais je n'ai pas trouvé d'exemple ni réussi à le faire.

0 votes

Un coup d'œil à la clé Services dans le Registre suggère que tous les paramètres nécessaires sont inclus dans la valeur ImagePath, de sorte que votre fichier binPath= "c:\abc\def.exe /Param1=ghi" semble être la bonne idée. Les barres obliques inversées doivent-elles être échappées (par exemple, "c : \\abc\\... ") ? Le pire, c'est que vous pouvez modifier directement la valeur du registre après coup si SC.EXE ne peut pas le faire.

1 votes

J'ai renoncé à sc.exe et j'utilise installutil.exe comme suit : Installutil.exe /ServiceName="TheName" /targetdir=" C:\TheInstallDirectory\ " /PackageRoot="PackageRootPath"

0 votes

J'ai utilisé Installutil.exe et pour les technologies plus anciennes, j'utilise Instsrv.exe de Windows XP/2003 Resource Ket.

297voto

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

L'astuce consiste à laisser un espace après le = dans votre instruction de création, et à utiliser " " pour tout ce qui contient des caractères spéciaux ou des espaces.

Il est conseillé de spécifier un nom d'affichage pour le service ainsi que de régler le paramètre de démarrage sur auto pour qu'il démarre automatiquement. Vous pouvez le faire en spécifiant DisplayName= yourdisplayname y start= auto dans votre déclaration de création.

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 ça a marché, vous devriez voir :

[SC] CreateService SUCCESS

MISE À JOUR 1

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

43 votes

Gardez à l'esprit que l'espace après binPath= ( binPath= "C:\..." ) besoins doit être présent, sinon cela ne fonctionnera pas.

0 votes

@Onion-Knight L'espace était exactement ce qui me manquait. Merci beaucoup

2 votes

start= auto est important, donc après le redémarrage, le service sera automatiquement lancé. Très bien dans le cas où l'utilisateur final n'est pas un expert.

218voto

HugoRune Points 3921

Les paramètres des services créés ont des problèmes de formatage particuliers, notamment si la commande comporte 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 complète entre guillemets. (Et laissez toujours un espace après binPath= et avant la première citation, comme l'a souligné mrswadge)

Donc, pour créer un service pour la commande PATH\COMMAND.EXE --param1=xyz vous devez utiliser 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.

Donc pour une commande qui a les deux paramètres y un chemin avec des espaces, vous devez citations emboîtées . Vous devez échapper aux guillemets internes avec des antislashes. \" . Il en va de même si les paramètres eux-mêmes contiennent des guillemets, vous devrez également les échapper.

Bien que les barres obliques inverses soient utilisées comme caractères d'échappement, il n'est pas nécessaire d'échapper aux barres obliques inverses ordinaires contenues dans le chemin. Ceci est contraire à la façon dont vous utilisez normalement les barres obliques inversées comme caractères d'échappement.

Ainsi, 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 

(les sauts de ligne sont ajoutés pour la lisibilité, ne les incluez pas)

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

En résumé

  • espace après chaque paramètre sc : binpath=_ , displayname=_ y depend=_
  • chaque paramètre sc qui contient des espaces doit être mis entre guillemets
  • tous les guillemets supplémentaires à l'intérieur du binpath sont échappés avec des backslashes : \"
  • tous les antislashs à l'intérieur du binpath ne sont pas échappés

9 votes

J'ai trouvé qu'il était important de s'assurer qu'il y ait un espace entre binPath= et la valeur "myservice.exe", c'est à dire. binPath= "myservice.exe . L'interpréteur de ligne de commande doit s'attendre à cela et exiger que la commande devienne un token en utilisant l'espace comme délimiteur.

0 votes

J'ai essayé de cette façon et ça a marché. SC.EXE " \\ServerName " Créer "Nom du service" BinPath="SampleService.exe"

6voto

Craig Carpenter Points 21

J'ai eu du mal à le faire fonctionner sous Windows 7. Il semblait ignorer le premier argument que je passais, alors j'ai utilisé binPath= "C:\path\to\service.exe -bogusarg -realarg1 -realarg2" et ça a marché.

4voto

Tony Points 31

J'avais l'habitude de le créer sans paramètres, puis de modifier le registre. HKLM\System\CurrentControlSet\Services\[YourService] .

3voto

user2535091 Points 11

Cette commande fonctionne :

sc create startSvn binPath= "\"C:\Subversion\bin\svnserve.exe\" --service -r \"C:\SVN_Repository\"" displayname= "MyServer" depend= tcpip start= auto

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X