2009-02-13 9 views
29

¿Cómo traducir los números de versión del sistema operativo MS Windows a nombres de productos?¿Cómo traducir los números de versión del sistema operativo MS Windows a nombres de productos en .NET?

Por ejemplo, en .NET las siguientes dos propiedades se podrían utilizar para saber que el producto es MS Windows Vista Ultimate Edition:

Environment.OSVersion.Platform returns Win32NT

Environment.OSVersion.Version returns 6.0.6001.65536

+0

lista completa de versiones (y nombres de productos respectivos) está disponible [aquí] (http://msdn.microsoft.com/library/windows/desktop/ ms724832.aspx) en MSDN –

+0

Probablemente no necesite traducirlo. Si necesita un nombre de versión de SO legible como "Microsoft Windows 7 Professional", use la propiedad OSFullName de ComputerInfo. Agregue una referencia a Microsoft.VisualBasic y el uso de Microsoft.VisualBasic.Devices. No te confundas con 'VisualBasic'. Eso funciona en cualquier idioma .Net. BTW ComputerInfo tiene otras propiedades útiles como el tamaño de la memoria física/virtual. – Den

Respuesta

46

howto net os version

VB :

Public Function GetOSVersion() As String 
    Select Case Environment.OSVersion.Platform 
     Case PlatformID.Win32S 
      Return "Win 3.1" 
     Case PlatformID.Win32Windows 
      Select Case Environment.OSVersion.Version.Minor 
       Case 0 
        Return "Win95" 
       Case 10 
        Return "Win98" 
       Case 90 
        Return "WinME" 
       Case Else 
        Return "Unknown" 
      End Select 
     Case PlatformID.Win32NT 
      Select Case Environment.OSVersion.Version.Major 
       Case 3 
        Return "NT 3.51" 
       Case 4 
        Return "NT 4.0" 
       Case 5 
        Select Case _ 
         Environment.OSVersion.Version.Minor 
         Case 0 
          Return "Win2000" 
         Case 1 
          Return "WinXP" 
         Case 2 
          Return "Win2003" 
        End Select 
       Case 6 
        Select Case _ 
         Environment.OSVersion.Version.Minor 
         Case 0 
          Return "Vista/Win2008Server" 
         Case 1 
          Return "Win7/Win2008Server R2" 
         Case 2 
          Return "Win8/Win2012Server" 
         Case 3 
          Return "Win8.1/Win2012Server R2" 
        End Select 
       Case 10 //this will only show up if the application has a manifest file allowing W10, otherwise a 6.2 version will be used 
        Return "Windows 10" 
       Case Else 
        Return "Unknown" 
      End Select 
     Case PlatformID.WinCE 
      Return "Win CE" 
    End Select 
End Function 

C#

public string GetOSVersion() 
{ 
    switch (Environment.OSVersion.Platform) { 
    case PlatformID.Win32S: 
     return "Win 3.1"; 
    case PlatformID.Win32Windows: 
     switch (Environment.OSVersion.Version.Minor) { 
     case 0: 
      return "Win95"; 
     case 10: 
      return "Win98"; 
     case 90: 
      return "WinME"; 
     } 
     break; 

    case PlatformID.Win32NT: 
     switch (Environment.OSVersion.Version.Major) { 
     case 3: 
      return "NT 3.51"; 
     case 4: 
      return "NT 4.0"; 
     case 5: 
      switch (Environment.OSVersion.Version.Minor) { 
      case 0: 
       return "Win2000"; 
      case 1: 
       return "WinXP"; 
      case 2: 
       return "Win2003"; 
      } 
      break; 

     case 6: 
      switch(Environment.OSVersion.Version.Minor) { 
      case 0: 
       return "Vista/Win2008Server"; 
      case 1: 
       return "Win7/Win2008Server R2"; 
      case 2: 
       return "Win8/Win2012Server"; 
      case 3: 
       return "Win8.1/Win2012Server R2"; 
      } 
      break; 
     case 10: //this will only show up if the application has a manifest file allowing W10, otherwise a 6.2 version will be used 
      return "Windows 10"; 
     } 
     break; 

    case PlatformID.WinCE: 
     return "Win CE"; 
    } 

    return "Unknown"; 
} 
+0

¿Por qué no las declaraciones de casos para VB y C#? También agregue una declaración adicional para Windows 7. – Keith

+0

cómo detectar Vista, Win2008, Win7 ??? – Kiquenet

+5

Los números de versión (tanto mayores como menores) para XP x64 y 2003 son idénticos == 5.2. Lo mismo aplica para Vista y 2008 == 6.0 y para 2008 R2 y Win7 == 6.1. Si necesita diferenciar entre estos sistemas, puede verificar la propiedad OSVersionInfo.OSProductType contra OSProductType.Workstation. (De http://www.codeproject.com/KB/system/osversion.aspx) – habakuk

4

Hay un ejemplo C++ en MSDN http://msdn.microsoft.com/en-us/library/ms724429(VS.85).aspx, junto con una nota que alguien se agrega sobre cómo envolverlo para su uso en .NET [VB]. Parece que el bit "faltante" que necesita es la función Win32 GetProductInfo (PInvoke.net reference for this).

Entre esto y la respuesta de Abram, que debe ser capaz de montar la cadena de versión completa.

+0

@Rob : basé mi respuesta en la etiqueta ".net" que se agregó a la pregunta – Avram

+0

Avram - Yeup, lo hizo - pero, P/Invoke es parte de .net, y es (¡hasta donde sé!) la única forma de agregue su respuesta para obtener la parte de "edición", es decir, "Ultimate Edition" o "Home Premium", etc. – Rob

+0

falla en Win2003: no se puede encontrar un punto de entrada llamado 'GetProductInfo' en DLL 'kernel32. dll '. – Kiquenet

12

Puede utilizar WMI para obtener el nombre del producto amigable ("Microsoft® Windows Server® 2008 Enterprise"):

using System.Management; 
var name = (from x in new ManagementObjectSearcher("SELECT * FROM Win32_OperatingSystem").Get().OfType<ManagementObject>() 
         select x.GetPropertyValue("Caption")).First(); 
return name != null ? name.ToString() : "Unknown"; 
1

Si lo que desea es un mensaje informativo amigable interfaz gráfica de usuario Solía ​​

mi. Computer.Info.OSFullName & "(" + My.Computer.Info.OSVersion + ")"

Parece ser a prueba del futuro para las versiones futuras de Windows

+2

Por favor, añada más información. ¿Cuál es exactamente la referencia 'My.Computer.Info.OSFullName'? ¿Es .NET, una clave de registro o una estructura?!? –

+0

https://msdn.microsoft.com/en-us/library/bfx6bse3(v=vs.90).aspx?f=255&MSPPError=-2147217396 –

3

Esta es mi solución, la más rápida y sin casos seleccionados.

el resultado puede ser personalizado como desee

public static string SistemaOperativo 
    { 
     get 
     { 
      #region Dichiarazioni 
      var osInfo = Environment.OSVersion; 
      int platformID = (int)osInfo.Platform; 
      int versionM = osInfo.Version.Major; 
      int versionm = osInfo.Version.Minor; 
      string servicePack = osInfo.ServicePack; 
      #endregion 

      #region Spiegazione logica 
      /* 
      * IT: 
      * La chiave del dizionario è il risultato del concatenamento di 
      * PlatformID,MajorVersion,MinorVersion, tutto convertito in Int32, 
      * per esempio Platform ID=1 MajorVersion=4 MinorVersion=0, 
      * il risultato è 140 ossia Windows 95 
      * 
      * EN: 
      * The key in Dictionary is the 'join' 
      * of PlatformID,MajorVersion,MinorVersion, in int32, 
      * eg. Platform ID=1 MajorVersion=4 MinorVersion=0, 
      * the result is '140' (Windows 95) 
      */ 
      #endregion 
      Dictionary<int, string> sistemiOperativi = new Dictionary<int, string>(){ 
         {0, "Windows 3.1"}, 
         {140, "Windows 95"}, 
         {1410, "Windows 98"}, 
         {1490, "Windows ME"}, 
         {2351, "Windows NT 3.51"}, 
         {240, "Windows 4.0"}, 
         {250, "Windows 2000"}, 
         {251, "Windows XP"}, 
         {252, "Windows 2003"}, 
         {260, "Windows Vista/Server 2008"}, 
         {261, "Windows 7"}, 
         {-1, "Unknown"} 
        }; 
      int idUnivoco = int.Parse(string.Format("{0}{1}{2}", platformID, versionM, versionm)); 
      string outValue = ""; 
      if (sistemiOperativi.TryGetValue(idUnivoco, out outValue)) 
       return string.Format("{0}{1}", outValue, servicePack); 
      return sistemiOperativi[-1]; 
     } 
    } 
+0

Como la simplicidad, y la explicación italiana XD –

+0

Grazie tante! Podría agregar alguna alternativa para ser una prueba futura. – beppe9000

Cuestiones relacionadas