none
SVP, un peu d'aide pour tester un petit programme RRS feed

  • Question

  • Bonjour,

    J'ai fait un petit programme qui me permet de tester la classe Win32_OperatingSystem . Je cherche à récupérer le nom  et le Service Pack en clair de l'OS, malheureusement je n'ai qu'un seul OS XP Pro et j'aurais voulu savoir ce que l'on peut obtenir avec Vista, Windows 7... et aussi ce qui se passe quand on a plusieurs OS différents installés sur le même ordinateur

    Le code est celui-ci :

    using System;
    
    using System.Collections.Generic;
    
    using System.Linq;
    
    using System.Management;
    
    using System.Text;
    
    
    
    namespace Cons_Win32_OperatingSystem
    
    {
    
      class Program
    
      {
    
       static void Main(string[] args)
    
       {
    
        String p_s ;
    
    
    
        Console.WriteLine("Test de la classe Win32_OperatingSystem");
    
        ManagementObjectSearcher p_mos = new ManagementObjectSearcher("SELECT * FROM Win32_OperatingSystem");
    
        foreach ( ManagementObject p_mo in p_mos.Get() )
    
        {
    
         Console.WriteLine("{0} properties",p_mo.Properties.Count);
    
         foreach ( PropertyData p_prop in p_mo.Properties )
    
         {
    
           p_s = p_prop.Name.PadRight(42) + " : ";
    
           if ( p_prop.Value == null )
    
           {
    
            p_s += "null";
    
           }
    
           else
    
           {
    
            if ( p_prop.IsArray )
    
            {
    
             p_s += "Array of " + Enum.GetName(typeof(CimType),p_prop.Type);
    
            }
    
            if ( p_prop.Type.Equals(CimType.DateTime) )
    
            {
    
             p_s += ManagementDateTimeConverter.ToDateTime(p_prop.Value.ToString()).ToString();
    
            }
    
            else
    
            {
    
             p_s += p_prop.Value.ToString();
    
            }
    
           }
    
           Console.WriteLine(p_s);
    
         }
    
        }
    
        Console.ReadLine();  
    
       }
    
      }
    
    }
    
    
    
    

    Le résultat est ( sur mon PC ) :

    Test de la classe Win32_OperatingSystem
    
    61 properties
    
    BootDevice         : \Device\HarddiskVolume1
    
    BuildNumber        : 2600
    
    BuildType         : Multiprocessor Free
    
    Caption         : Microsoft Windows XP Professionnel
    
    CodeSet         : 1252
    
    CountryCode        : 33
    
    CreationClassName       : Win32_OperatingSystem
    
    CSCreationClassName      : Win32_ComputerSystem
    
    CSDVersion         : Service Pack 3
    
    CSName          : LAMBIN-1D6EECAC
    
    CurrentTimeZone       : 120
    
    DataExecutionPrevention_32BitApplications : True
    
    DataExecutionPrevention_Available   : True
    
    DataExecutionPrevention_Drivers   : True
    
    DataExecutionPrevention_SupportPolicy  : 2
    
    Debug          : False
    
    Description        : Ordinateur de Patrick
    
    Distributed        : False
    
    EncryptionLevel       : 168
    
    ForegroundApplicationBoost     : 2
    
    FreePhysicalMemory       : 949796
    
    FreeSpaceInPagingFiles      : 2869208
    
    FreeVirtualMemory       : 2054072
    
    InstallDate        : 28/06/2010 11:37:54
    
    LargeSystemCache       : 0
    
    LastBootUpTime        : 01/09/2010 11:52:34
    
    LocalDateTime        : 01/09/2010 22:24:47
    
    Locale          : 040c
    
    Manufacturer        : Microsoft Corporation
    
    MaxNumberOfProcesses      : 4294967295
    
    MaxProcessMemorySize      : 2097024
    
    Name          : Microsoft Windows XP Professional|C
    
    :\WINDOWS|\Device\Harddisk0\Partition1
    
    NumberOfLicensedUsers      : null
    
    NumberOfProcesses       : 50
    
    NumberOfUsers        : 4
    
    Organization        :
    
    OSLanguage         : 1036
    
    OSProductSuite        : null
    
    OSType          : 18
    
    OtherTypeDescription      : null
    
    PlusProductID        : null
    
    PlusVersionNumber       : null
    
    Primary         : True
    
    ProductType        : 1
    
    QuantumLength        : 0
    
    QuantumType        : 0
    
    RegisteredUser        : Lambin
    
    SerialNumber        : 76413-OEM-0060521-50792
    
    ServicePackMajorVersion     : 3
    
    ServicePackMinorVersion     : 0
    
    SizeStoredInPagingFiles     : 4035044
    
    Status          : OK
    
    SuiteMask         : 272
    
    SystemDevice        : \Device\HarddiskVolume1
    
    SystemDirectory       : C:\WINDOWS\system32
    
    SystemDrive        : C:
    
    TotalSwapSpaceSize       : null
    
    TotalVirtualMemorySize      : 2097024
    
    TotalVisibleMemorySize      : 2096620
    
    Version         : 5.1.2600
    
    WindowsDirectory       : C:\WINDOWS
    
    

    Le programme a été écrit avec VC# Express 2010 mais le même code devrait marcher sans problème avec VC# 2008 ( VS Standard 2008 ). Petit détail : il faudra rajouter une référence à System.Management.

    Je peux de cette façon récupérer le nom en clair de l'OS ( ==> Caption ), celui du Service Pack ( ==> CSDVersion ), la date d'installation de le l'OS ( ==> InstalDate ), l'heure et date du dernier démarrage ( ==> LastBootUpDate ).

    Par contre, j'obtiens des résultats bizarres avec Locale qui devrait être un String qui semble contenir un genre de codepage traduit en Hexadécimal ( ??? )

    Le lien vers la classe Win32_OperatingSystem est :

    http://msdn.microsoft.com/en-us/library/aa394239(v=VS.85).aspx

    J'essaie de faire un programme qui puisse passer sur tout OS >= XP et Windows Server 2003 , donc il faut que je puisse trouver des erreurs détectables sur des OS autres que XP ainsi que sur des ordinateurs multi-boot.

    Je suis très, très interessé par des suggestions ou reproches concernant mon code ( la meilleure façon de s'améliorer ). Au passage, si quelqu'un connait une autre façon plus simple ( sauf la lecture du registre que je rejette car , comme l'avait dit Mike Wachal, le registre appartient à Microsoft qui peut décider d'en modifier la structure sans prévenir )

    Merci d'avance et bonne journée


    Mark Post as helpful if it provides any help.Otherwise,leave it as it is.
    • Modifié Papy Normand mercredi 1 septembre 2010 21:50 CSDVersion au lieu de DSVersion
    mercredi 1 septembre 2010 21:18

Réponses

  • Bonjour,

    J'ai testé votre code sous Windows 7 est il est tout à fait fonctionnel.

    Pour la locale il s'agit effectivement de l'identifiant de culture en héxa : 0x040C soit 1036 pour la france

    POur obtenir des informations plus pertinente vous pouvez utiliser l'objet CultureInfo. Par exemple :

    if ( p_prop.Name == "Locale" )
    {
       System.Globalization.CultureInfo info = new System.Globalization.CultureInfo(int.Parse(p_prop.Value.ToString(), System.Globalization.NumberStyles.HexNumber), false);
       p_s += String.Format("{0} - {1}", p_prop.Value, info.Name);
    }
    

    Cordialement

    • Marqué comme réponse Papy Normand jeudi 2 septembre 2010 16:47
    jeudi 2 septembre 2010 14:23
    Modérateur

Toutes les réponses

  • Bonjour,

    La propriété Environment.OsVersion (http://msdn.microsoft.com/fr-fr/library/system.environment.osversion.aspx) ne devrait-il pas vous simplifier la tâche au lieu de passer des classes WMI ?

    Pour les OS multiboot, les informations retournées par les API Windows (et donc ce qui est au dessus : .NET, WMI,...etc) sont les informations de l'OS booté uniquement.

    Cordialement


    Gilles TOURREAU - MVP C# - MCTS ADO .NET 3.5 - MCPD Windows Developper 3.5 - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    jeudi 2 septembre 2010 07:15
    Modérateur
  • Bonjour,

    J'ai testé votre code sous Windows 7 est il est tout à fait fonctionnel.

    Pour la locale il s'agit effectivement de l'identifiant de culture en héxa : 0x040C soit 1036 pour la france

    POur obtenir des informations plus pertinente vous pouvez utiliser l'objet CultureInfo. Par exemple :

    if ( p_prop.Name == "Locale" )
    {
       System.Globalization.CultureInfo info = new System.Globalization.CultureInfo(int.Parse(p_prop.Value.ToString(), System.Globalization.NumberStyles.HexNumber), false);
       p_s += String.Format("{0} - {1}", p_prop.Value, info.Name);
    }
    

    Cordialement

    • Marqué comme réponse Papy Normand jeudi 2 septembre 2010 16:47
    jeudi 2 septembre 2010 14:23
    Modérateur
  • Bonjour ,

    Pour Gilles : merci pour l'info multiboot mais j'aurais du mieux regarder au début de la page correspondant à Win32_OperatingSystem

    http://msdn.microsoft.com/en-us/library/aa394239(v=VS.85).aspx

    j'aurais découvert :

    "Windows Server 2003, Windows XP, and Windows 2000:  If a computer has multiple operating systems installed, this class only returns an instance for the currently active operating system"

    Par contre, quid pour Vista,Windows 7 et Windows Server 2008  qui ne sont pas mentionnés dans le BOL ( peut-être que le BOL n'a pas été mis à jour?

    Pourquoi ne pas utiliser Environment.OsVersion ? Je n'obtiendrais que la chaîne 5.1.2600 qui n'est pas très claire. Je peux obtenir avec Win32_OperatingSystem des infos plus parlante comme Microsoft Windows Server 2008 R2 Service Pack 1 ( si j'utilise OtherTypeDescription ). De plus, je peux obtenir d'autres infos qui peuvent être utiles en cas de problèmes ( Date d'installation de l'OS,date du dernier boot ou le n° de série de l'OS )

    Pour nikho et la propriété Locale, je pense que 0x040C en hexa correspond en décimal à 1036. Le problème est sans doute lié au fait que Locale est un String  défini comme

    "Language identifier used by the operating system. A language identifier is a standard international numeric abbreviation for a country/region. Each language has a unique language identifier (LANGID), a 16-bit value that consists of a primary language identifier and a secondary language identifier"

    Par contre, votre solution m'intéresse au plus haut ( elle ne rappelle le bon vieux temps où je programmais en C sur des OS 16 bits mais où les valeurs système étaient exprimées en octal il y a 20 ans ), surtout l'énumération NumberStyles que j'avais complètement oubliée. Je vais donc introduire votre code dans mon source, donc Merci

    Bonne journée


    Mark Post as helpful if it provides any help.Otherwise,leave it as it is.
    jeudi 2 septembre 2010 16:47