none
Interroger la version de l'assembly à partir d'un autre serveur RRS feed

  • Question

  • Bonjour.

          J'ai besoin de vérifier le numéro d'assembly des services windows installés sur d'autres serveurs (le projet sur lequel je travaille comprend une répartion de la charge sur plusieurs serveurs windows avec un service qui pilote le tout). Lors de l'installation d'une mise à jour j'ai donc besoin de vérifier que l'ensemble des serveurs a bien été patché.

          La solution la plus simple serait de pouvoir interroger à distance la version des services, est-ce que cela est possible ?


    • Modifié CMIS jeudi 12 avril 2012 18:38
    jeudi 12 avril 2012 18:37

Réponses

  • Au pire pourquoi ne pas proposer la méthode GetVersion à tous tes services ? Tu n'as pas la main dessus ?

    samedi 14 avril 2012 13:56
  • Bonjour,

    J'ai remplacé

    string s = queryObj["Version"];

    par :

    Object o = queryObj["Version"];

    o est null, d'ou l'exception avec le string.

    Pour la solution avec GetVersion (), c'est en fait ma deuxième solution:

    Dans mon service pilote j'ai mis ce code pour récupérer le numéro de version de l'assembly et l'inscrire en base de donnée.

    Assembly assembly = Assembly.GetEntryAssembly();
    Constants.MajVersionMoteur(assembly.GetName().Version.ToString());

    Si la méthode directe ne fonctionnait pas, je peux faire la même chose dans mes autres services, puis utiliser les WCF pour récupérer les valeurs. Dans ce cas je doit modifier tous les services.

    Bonne journée

    mercredi 18 avril 2012 11:49

Toutes les réponses

  • Au pire pourquoi ne pas proposer la méthode GetVersion à tous tes services ? Tu n'as pas la main dessus ?

    samedi 14 avril 2012 13:56
  • Bonjour,

    En utilisant les objets WMI, il est possible d'accéder aux informations d'un ordinateur distant.

    L'exemple ci-dessous montre la récupération de la version du fichier (attribut AssemblyFileVersion) de l'assembly d'un service:

    ManagementScope scope = new ManagementScope(string.Format(@"\\{0}\root\cimv2", computerName));
    scope.Connect();

    ObjectQuery query = new ObjectQuery(
        string.Format("SELECT * FROM Win32_Service WHERE Name='{0}'", serviceName));

    ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
    ManagementObjectCollection.ManagementObjectEnumerator enumerator = searcher.Get().GetEnumerator();
    enumerator.MoveNext();
    ManagementObject queryObj = (ManagementObject)enumerator.Current;

    string pathName = ((string)queryObj["PathName"]);
    pathName = pathName.Substring(1, pathName.Length - 2);
    pathName = pathName.Replace("\\", "\\\\");
    query = new ObjectQuery(
        string.Format("SELECT * FROM CIM_DataFile WHERE Name='{0}'", pathName));

    searcher = new ManagementObjectSearcher(scope, query);
    enumerator = searcher.Get().GetEnumerator();
    enumerator.MoveNext();
    queryObj = (ManagementObject)enumerator.Current;
    Console.WriteLine("Version: {0}", queryObj["Version"]);

    Plus d'informations sur WMI et .NET: http://msdn.microsoft.com/en-us/library/windows/desktop/aa394582(v=vs.85).aspx

    Frédéric

    lundi 16 avril 2012 15:04
  • Bonjour, CMIS,

    Est-ce que vous avez pu avancer en utilisant les infos reçues ? Merci de tenir la communauté informée sur la suite de vos démarches.

    Bonne journée,

    Cipri


    Suivez MSDN sur Twitter   Suivez MSDN sur Facebook


    Ciprian DUDUIALA, MSFT  
    •Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.

    mardi 17 avril 2012 08:06
  • Bonjour,

    J'ai mis un peu de temps à tester, je n'ai pas internet sur mon poste de travail. Merci pour les réponses.

    J'ai testé le code WMI ci-dessus, je récupère bien des informations sur mon service distant, mais pas le numéro de version.

    j'ai rajouté l'intermédiaire

    string s = queryObj["Version"];

    avant le Console.WriteLine() et cela lève une exception.

    Est-ce cela est en rapport avec le fait d'exposer GetVersion()?

    J'ai la main sur les services, je peux les modifier au besoin.


    mardi 17 avril 2012 14:13
  • Bonjour,

    Non, les deux solutions suivent deux pistes différentes. Dans le premier cas, Vincent vous propose exposer une méthode GetVersion dans vos services, dans cette méthode vous pouvez facilement déterminer la version de l’assembly (voir aussi ces exemples) et puis appeler cette méthode de vos services pour obtenir les versions. D’autre côté, Frédéric vous propose une solution qui ne suppose pas modifier les services (voir aussi cette discussion et cette solution), mais il semble qu’il y a une erreur au moment de récupération de la version. Pour vous aider avancer avec cette solution il faut nous préciser aussi le message d’erreur.

    Bonne journée,

    Cipri


    Suivez MSDN sur Twitter   Suivez MSDN sur Facebook


    Ciprian DUDUIALA, MSFT  
    •Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.

    mercredi 18 avril 2012 07:08
  • Bonjour,

    J'ai remplacé

    string s = queryObj["Version"];

    par :

    Object o = queryObj["Version"];

    o est null, d'ou l'exception avec le string.

    Pour la solution avec GetVersion (), c'est en fait ma deuxième solution:

    Dans mon service pilote j'ai mis ce code pour récupérer le numéro de version de l'assembly et l'inscrire en base de donnée.

    Assembly assembly = Assembly.GetEntryAssembly();
    Constants.MajVersionMoteur(assembly.GetName().Version.ToString());

    Si la méthode directe ne fonctionnait pas, je peux faire la même chose dans mes autres services, puis utiliser les WCF pour récupérer les valeurs. Dans ce cas je doit modifier tous les services.

    Bonne journée

    mercredi 18 avril 2012 11:49