Lors de la création du service Windows en utilisant:
sc create ServiceName binPath= "the path"
comment les arguments peuvent-ils être passés à la collection Context.Parameters de la classe Installer?
Ma lecture de la sc.exe
documentation 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 pu le faire avec succès.
windows-services
greg sympatrique
la source
la source
binPath= "c:\abc\def.exe /Param1=ghi"
semblez être la bonne idée. Les barres obliques inverses doivent-elles être échappées (par exemple "c: \\ abc \\ ...")? Pire encore, vous pouvez modifier directement la valeur du registre par la suite si SC.EXE ne peut pas le faire.Réponses:
L'astuce consiste à laisser un espace après le = dans votre instruction create, et également à 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 définir le paramètre de démarrage sur auto afin qu'il démarre automatiquement. Vous pouvez le faire en spécifiant
DisplayName= yourdisplayname
etstart= auto
dans votre instruction create.Voici un exemple:
Si cela a fonctionné, vous devriez voir:
MISE À JOUR 1
http://support.microsoft.com/kb/251192
la source
binPath= "C:\..."
) doit être présent, sinon cela ne fonctionnera pas.start= auto
est important, donc après le redémarrage, le service sera automatiquement démarré. Très bien au cas où l'utilisateur final ne serait pas un expertbinPath
qui nécessitent des guillemets, ils doivent être échappés (\"
) exemple: si le chemin était,c:\some long path\some.exe "first argument"
il devrait êtrebinPath= "\"c:\some long path\some.exe\" \"first argument\""
binPath= ...
etDisplayName= ...
; dans mon cas, j'ai oublié le "=" après DisplayName), alors la console imprimera les instructions d'utilisation de lacreate
commande; comme:DESCRIPTION: Creates a service entry... USAGE: sc <server> create....
etcLes paramètres des services créés présentent des problèmes de format particuliers, en particulier si la commande comprend des espaces ou des guillemets:
Si vous souhaitez entrer des paramètres de ligne de commande pour le service, vous devez mettre toute la ligne de commande entre guillemets. (Et laissez toujours un espace après
binPath=
et avant la première citation, comme l'a souligné mrswadge)Ainsi, pour créer un service pour la commande,
PATH\COMMAND.EXE --param1=xyz
vous utiliseriez le paramètre binPath suivant:Si le chemin d' accès à l'exécutable contient des espaces , vous devez mettre le chemin entre guillemets.
Donc, pour une commande qui a à la fois des paramètres et un chemin avec des espaces, vous avez besoin de guillemets imbriqués . Vous devez échapper les guillemets intérieurs avec des barres obliques inverses \". Il en va de même si les paramètres eux-mêmes contiennent des guillemets, vous devrez également les échapper.
Malgré l'utilisation de barres obliques inverses comme caractères d'échappement, vous n'avez pas besoin d'échapper aux barres obliques inverses régulières contenues dans le chemin. Ceci est contraire à la façon dont vous utilisez normalement des barres obliques inverses comme caractères d'échappement.
Donc pour une commande comme
"PATH WITH SPACES \COMMAND.EXE" --param-with-quotes="a b c" --param2
:Voici un exemple concret de la documentation SVNserve, qui montre tous les cas particuliers:
(les sauts de ligne sont ajoutés pour plus de 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"
.Donc en résumé
binpath=_
,displayname=_
etdepend=_
la source
binPath= "myservice.exe
. L'interpréteur de ligne de commande doit s'y attendre et exiger que la commande devienne un jeton en utilisant l'espace comme délimiteur.Voir ici: Modifier le "Chemin vers l'exécutable" d'un service Windows
la source
J'ai eu des problèmes pour que cela fonctionne sur Windows 7. Il semblait ignorer le premier argument que j'ai transmis, alors j'ai utilisé
binPath= "C:\path\to\service.exe -bogusarg -realarg1 -realarg2"
et cela a fonctionné.la source
J'utilise pour simplement le créer sans paramètres, puis modifier le registre
HKLM\System\CurrentControlSet\Services\[YourService]
.la source
Cette commande fonctionne:
la source
Il est également important de prendre en compte la manière dont vous accédez aux arguments dans le code de l'application.
Dans mon application c #, j'ai utilisé la classe ServiceBase:
J'ai enregistré mon service en utilisant
sc create myService binpath = "MeyService.exe arg1 arg2"
Mais je ne pouvais pas accéder aux arguments via la
args
variable lorsque je l'exécutais en tant que service.La documentation MSDN suggère de ne pas utiliser la méthode Main pour récupérer les arguments
binPath
ouImagePath
. Au lieu de cela, il suggère de placer votre logique dans laOnStart
méthode, puis d'utiliser (C #)Environment.GetCommandLineArgs();
.Pour accéder aux premiers arguments,
arg1
je dois faire comme ceci:cela imprimerait
la source
J'ai trouvé un moyen d'utiliser sc.
sc config binPath = "\" c: \ chemin avec des espaces \ service_executable.exe \ ""
En d'autres termes, utilisez \ pour échapper à tous les "s que vous voulez survivre au transit dans le registre.
la source
Un exemple de création de service d'utilisation de barres obliques inverses avec de nombreux guillemets.
la source
Assurez-vous d'avoir des guillemets au début et à la fin de votre valeur binPath.
la source
Je ne pouvais pas gérer le problème avec vos propositions, à la fin avec le dossier x86, cela ne fonctionnait que dans Power Shell (Windows Server 2012) en utilisant des variables d'environnement:
la source
Si vous avez essayé tout ce qui précède et que vous ne pouvez toujours pas passer d'arguments à 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 via "sc start arg1 arg2 ..." , SC appelle la fonction ServiceMain de votre service directement avec ces arguments. Mais lorsque Windows démarre votre service (au démarrage, par exemple), c'est la fonction principale de votre service (_tmain) qui est appelée, avec les paramètres du "binPath" du registre.
la source
cela ne fonctionne pas dans le Powershell et devrait utiliser CMD dans mon cas
la source