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

StackOverflow https://stackoverflow.com/questions/3663331

  •  01-10-2019
  •  | 
  •  

Question

Lors de la création de service Windows en utilisant:

sc create ServiceName binPath= "the path"

comment peut-être des arguments transmis à la collection Context.Parameters de la classe d'installation?

Ma lecture de la documentation sc.exe est que ces arguments ne pouvaient être transmis à la fin de binPath, mais je n'ai pas trouvé un exemple ou été en mesure de le faire avec succès.

Était-ce utile?

La solution

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

L'astuce consiste à laisser un espace après le = dans votre create, et aussi à l'utilisation « » 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 le réglage de la mise au début automatique afin qu'il démarre automatiquement. Vous pouvez le faire en spécifiant DisplayName= yourdisplayname et start= auto dans votre 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 vous travailliez devriez voir:

[SC] CreateService SUCCESS

UPDATE 1

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

Autres conseils

Paramètres des services créés ont certaines questions propres formating, en particulier si la commande comprend des espaces ou des guillemets:

Si vous voulez entrer les paramètres de ligne de commande pour le service, vous devez joindre toute la ligne de commande entre guillemets. (Et toujours laisser un espace après binPath= et avant la première citation, comme mrswadge souligné)

Alors, pour créer un service pour la commande PATH\COMMAND.EXE --param1=xyz vous utilisez 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 paramètres et un chemin avec des espaces, vous avez besoin citations imbriquées . Vous devez échapper aux citations internes avec antislashs \ ". La même chose si les paramètres eux-mêmes contiennent des guillemets, vous aurez besoin pour échapper à ceux qui sont trop.

Malgré l'utilisation d'anti-slash comme caractères d'échappement, vous n'avez pas les backslashs réguliers contenus dans le chemin. Cela est contraire à la façon dont vous utilisez normalement antislashs comme des caractères d'échappement.

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 de la documentation Svnserve, qui montre tous les cas spéciaux:

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

(sauts de ligne sont ajoutés pour une meilleure lisibilité, ne comprennent pas)

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 paramètre sc: binpath=_, displayname=_ et depend=_
  • chaque paramètre sc qui contient des espaces doit être entre guillemets
  • toutes les citations supplémentaires à l'intérieur du binpath sont échappés avec barre oblique inverse: \ "
  • tous les antislash à l'intérieur du binpath ne sont pas échappés
sc create "YOURSERVICENAME" binpath= "\"C:\Program Files (x86)\Microsoft SQL Server\MSSQL11\MSSQL\Binn\sqlservr.exe\" -sOPTIONALSWITCH" start= auto 

Voir ici: Modification de la "Path to exécutable" de un service windows

J'avais des problèmes à obtenir que cela fonctionne sur Windows 7. Il semblait ignorer le premier argument je suis passé alors j'ai utilisé binPath= "C:\path\to\service.exe -bogusarg -realarg1 -realarg2" et cela a fonctionné.

Je l'utilise pour créer simplement sans paramètres, puis modifier le Registre HKLM\System\CurrentControlSet\Services\[YourService].

Cette commande fonctionne:

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

Il prise également important compte comment accéder aux arguments dans le code de l'application.

Dans mon application c # J'utilisé la classe ServiceBase:

 class MyService : ServiceBase
{

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

J'enregistré mon service à l'aide

sc créer myService binpath = "MeyService.exe arg1 arg2"

Mais je ne pouvais pas accéder aux arguments par la variable args quand je le lance comme un service.

La documentation MSDN suggère de ne pas utiliser la méthode principale pour récupérer les arguments de binPath ou ImagePath. il suggère plutôt de placer votre logique dans la méthode OnStart puis en utilisant (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]);

       }
 }

imprimerait

       arg1 == arg1

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

sc config binPath = "\" c: \ chemin avec des espaces dans ce \ service_executable.exe \ » «

En d'autres termes, utilisez \ 'échapper à un « ' s vous voulez survivre le transit dans le registre.

Assurez-vous d'avoir des citations au début et à la fin de votre valeur binPath.

Je ne pouvais pas traiter la question avec vos propositions, à la fin avec le x86 dossier, il ne fonctionnait que dans la coquille de puissance (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}

Si vous avez essayé tous les ci-dessus et ne peut 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 démarrez votre service par « sc start arg1 arg2. .. ", SC appelle la fonction ServiceMain de votre service directement avec les args. Mais lorsque Windows démarre votre service (au démarrage, par exemple), il est la fonction principale de votre service (_tmain) qui est appelé, avec params de « binPath » du registre.

Un exemple de création de services d'utiliser antislashs avec beaucoup de guillemets doubles.

C:\Windows\system32>sc.exe create teagent binpath= "\"C:\Program Files\Tripwire\TE\Agent\bin\wrapper.exe\" -s \"C:\Program Files\Tripwire\TE\Agent\bin\agent.conf\"" DisplayName= "Tripwire Enterprise Agent"

[SC] CreateService SUCCESS
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top