Meilleur auteur de réponses
Problème d'ajout d'argument lors de l'installation d'un service windows

Question
-
Bonjour,
je vous expose mon problème brievement :
J'ai besoin que mon service windows s'installe avec des arguments tel quel --console par exemple.
Tout comme svchost par exemple qui possède des lancements de service de ce genre.
C:\Windows\system32\svchost.exe -k LocalService
Afin d'ajouter automatique un paramètre à l'installation j'ai fais un override sur la fonction Install (public override void Install(System.Collections.IDictionary stateSaver)) afin d'ajouter dans l'assemblypath le paramètre --console.
L'override remplie bien son role, mais le problème est que l'assemblypath contenant un espace windows ajoute automatiquement des quotes de part et d'autres de la string résultat l'argument est inclus dans le path et non plus en tant qu'argument, ce qui empêche windows de lancer le service puisque le chemin ne correspond plus à un exe sur le disque.
Quelqu'un as t'il une solution pour régler ce problème ?
Merci à tous.
Voici le contenue de la fonction Install :
Extrait de code
string strAssPath = "/assemblypath=\"{0}\" --servicerun";
Context = new InstallContext("", new string[] { String.Format(strAssPath, System.Reflection.Assembly.GetExecutingAssembly().Location) });base.Install(stateSaver);
Réponses
-
Bonjour,
Voila un petit bout de code à mettre dans votre classe ProjectInstaller :
Extrait de codepublic
ProjectInstaller(){
InitializeComponent();
}
{
// modifie la clé ImagePath pour rajouter le paramètre
service.SetValue(
"ImagePath", (string)service.GetValue("ImagePath") + " --servicerun");}
Si vous voulez accéder aux paramètres ailleurs que dans la méthode Main, vous devrez utiliser "Environment.GetCommandLineArgs()".
Guillaume
Toutes les réponses
-
Bonjour,
Je suis pas trop sur de ma réponse mais essayez ceci :
Extrait de codeContext = new InstallerContext("", new string[] { String.Format("/assemblypath=\"{0}\"", System.Reflection.Assembly.GetExecutingAssembly().Location), "--servicerun" });
base.Install(stateServer)
Guillaume
-
Désolé pour le temps de réponse mais j'avais beaucoup de choses urgentes à régler en priorité.
J'ai essayé votre proposition mais hélas, cela ne fonctionne pas. La chaine se trouve doublement quoter et il n'y a pas d'argument dans le service une fois installé. Je me demande comment est-il possible qu'une chose aussi simple n'ai pas de solution facile. Quoi qu'il en soit merci pour votre réponse.
Puisqu'il me semble que personne n'a de solution au problème concerné, je vais directement exposer pourquoi je souhaite un service avec argument.
En faite mon service windows se trouve être également une aplication console. dans le Main je vérifie le passage d'argument et si celui contient l'argument souhaité alors j'instancie la classe Installer de mon projet ServiceWindows inclue dans ma solution.
L'inverse n'est pas envisageable puisque je veux que la console puisse être démarré depuis l'explorateur (donc sans argument).
La dernière solution envisageable est de vérifier qui a lancé la console afin de ne pas attendre d'arguments, mais je préférais tout de même la solution via service possédant un argument de lancement et de manière automatisée (sans intervention ou script post installation). -
-
Le problème est que Windows entoure la totalité du Path avec des quotes donc on se retrouvera toujours avec un seul et
unique Path contenant des espaces des espaces, des quotes, ...
Connaitre les arguments et leur nombres étant effectivement aisé, je souhaitais utiliser ce système pour identifier
qui est à l'origine du lancement (gestionnaire de service Windows ou double clic).
Soit je vérifie pour enlever moi même les doubles quotes dans la base des registres a la fin de l'installation (ce que je trouve trés sale...) ou bien si le lanceur est le système ou l'utilisateur.
Pour le moment j'ai pas mal de truc en suspens donc dés que j'ai à nouveau le temps pour ça je viendrais rafraichir le forum avec une réponse ou une alternative. -
Bonjour,
Voila un petit bout de code à mettre dans votre classe ProjectInstaller :
Extrait de codepublic
ProjectInstaller(){
InitializeComponent();
}
{
// modifie la clé ImagePath pour rajouter le paramètre
service.SetValue(
"ImagePath", (string)service.GetValue("ImagePath") + " --servicerun");}
Si vous voulez accéder aux paramètres ailleurs que dans la méthode Main, vous devrez utiliser "Environment.GetCommandLineArgs()".
Guillaume
-
Effectivement ce système fonctionne, même si je classifierai (pour ma part) ce type de méthode comme une "bidouille".
C'est effectivement le plus propre que l'on puisse faire avec apparament les moyens fournis par le .Net.
J'aurais préféré avoir la possibilité de le faire via la classe d'installation prévu à cette effet, mais il semblerai que ce ne soit pas possible.
Je vous remercie pour le temps consacré pour répondre à ce problème et pour la réponse apporté, qui est selon moi une des alternative les plus rapides.
Je marque votre réponse comme satisfaisante et comme répondant au problème. Néanmoins si un jour quelqu'un passe par la et connais un moyen non détourné pour ajouter un argument a un service windows lors de son install (via le code) je suis preneur.
Merci à tous.