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.
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
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=_
etdepend=_
- 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
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
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é.
- je utiliser pour créer 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 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
assurez-vous d'avoir des guillemets au début et à la fin de votre binPath.
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.
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}
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.