none
Problème d'ajout d'argument lors de l'installation d'un service windows RRS feed

  • 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);
    mercredi 5 décembre 2007 10:35

Réponses

  • Bonjour,

     

    Voila un petit bout de code à mettre dans votre classe ProjectInstaller :

     

    Extrait de code

    public ProjectInstaller()

    {

    InitializeComponent();

    this.AfterInstall += new InstallEventHandler(ProjectInstaller_AfterInstall);

    }

     

    void ProjectInstaller_AfterInstall(object sender, InstallEventArgs e)

    {

    // modifie la clé ImagePath pour rajouter le paramètre

    RegistryKey system = Registry.LocalMachine.OpenSubKey("System");

    RegistryKey currentControlSet = system.OpenSubKey("CurrentControlSet");

    RegistryKey services = currentControlSet.OpenSubKey("Services");

    RegistryKey service = services.OpenSubKey(this.serviceInstaller1.ServiceName, true);

    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

    mardi 11 décembre 2007 09:49

Toutes les réponses

  • Bonjour,

    Je suis pas trop sur de ma réponse mais essayez ceci :

     

    Extrait de code

    Context = new InstallerContext("", new string[]  { String.Format("/assemblypath=\"{0}\"", System.Reflection.Assembly.GetExecutingAssembly().Location), "--servicerun" });

    base.Install(stateServer)

     

     

    Guillaume

    mercredi 5 décembre 2007 15:27
  • 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).
    lundi 10 décembre 2007 08:46
  • Et mettant chaque argument entre quotes ca ne fonctionnerait pas? C'est une idée totalement en l'air sans test.

     

    Pour savoir le nombre d'arguments ca c'est simple. Donc de ce fait, il est aisé de voir si il y a des arguments qui sont passés ou pas.

    lundi 10 décembre 2007 12:49
  • 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.
    mardi 11 décembre 2007 08:35
  • Bonjour,

     

    Voila un petit bout de code à mettre dans votre classe ProjectInstaller :

     

    Extrait de code

    public ProjectInstaller()

    {

    InitializeComponent();

    this.AfterInstall += new InstallEventHandler(ProjectInstaller_AfterInstall);

    }

     

    void ProjectInstaller_AfterInstall(object sender, InstallEventArgs e)

    {

    // modifie la clé ImagePath pour rajouter le paramètre

    RegistryKey system = Registry.LocalMachine.OpenSubKey("System");

    RegistryKey currentControlSet = system.OpenSubKey("CurrentControlSet");

    RegistryKey services = currentControlSet.OpenSubKey("Services");

    RegistryKey service = services.OpenSubKey(this.serviceInstaller1.ServiceName, true);

    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

    mardi 11 décembre 2007 09:49
  • 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.


    mardi 11 décembre 2007 12:13