如何将 MS Windows 操作系统版本号转换为 .NET 中的产品名称?

Posted

技术标签:

【中文标题】如何将 MS Windows 操作系统版本号转换为 .NET 中的产品名称?【英文标题】:How to translate MS Windows OS version numbers into product names in .NET? 【发布时间】:2010-10-07 10:28:24 【问题描述】:

如何将 MS Windows 操作系统版本号翻译成产品名称?

例如,在 .NET 中,可以使用以下两个属性来确定产品是 MS Windows Vista Ultimate Edition:

Environment.OSVersion.Platform returns Win32NT

Environment.OSVersion.Version returns 6.0.6001.65536

【问题讨论】:

完整的版本列表(以及相应的产品名称)可在 MSDN 上的here 获得 可能不需要翻译。如果您需要可读的操作系统版本名称,例如“Microsoft Windows 7 Professional”,请使用 ComputerInfo 的属性 OSFullName。添加对 Microsoft.VisualBasic 的引用并使用 Microsoft.VisualBasic.Devices。不要被“VisualBasic”所迷惑。这适用于任何 .Net 语言。顺便说一句,ComputerInfo 有一些其他有用的属性,例如物理/虚拟内存大小。 【参考方案1】:

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";

【讨论】:

为什么不使用 VB 和 C# 的 case 语句?还为 Windows 7 添加额外的语句。 XP x64 和 2003 的版本号(主要和次要)相同 == 5.2。这同样适用于 Vista 和 2008 == 6.0 以及 2008 R2 和 Win7 == 6.1。如果需要区分这些系统,可以对照 OSProductType.Workstation 检查 OSVersionInfo.OSProductType 属性。 (来自codeproject.com/KB/system/osversion.aspx) 值得一提的是,您不会在 xp/2003 以下的任何设备上运行任何 .net 代码,因此可以删除上述许多 os 值。 @Soenhay Windows 8 已经存在。如果你有一台 Windows 10 机器,你可以运行类似的代码来找出数字,然后自己更新。 (这就是编辑按钮的美妙之处。) @wizzwizz4 我必须确保我没有发疯,但在我的评论之后添加了 win8 和 win10:***.com/posts/545698/revisions【参考方案2】:

这是我的解决方案,最快且没有特定情况。

结果可以根据需要自定义

 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("012", platformID, versionM, versionm));
            string outValue = "";
            if (sistemiOperativi.TryGetValue(idUnivoco, out outValue))
                return string.Format("01", outValue, servicePack);
            return sistemiOperativi[-1];
        
    

【讨论】:

喜欢简洁,意大利文的解释XD 谢天谢地!您可以添加一些后备以作为未来的证明。【参考方案3】:

如果你只想要我使用的 GUI 友好的信息消息

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

似乎是未来版本的 Windows 的未来证明

【讨论】:

请添加更多信息。参考My.Computer.Info.OSFullName 到底是什么?它是 .NET、注册表项还是结构?!? msdn.microsoft.com/en-us/library/…【参考方案4】:

您可以使用 WMI 获取友好的产品名称(“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";

【讨论】:

【参考方案5】:

在 msdn http://msdn.microsoft.com/en-us/library/ms724429(VS.85).aspx 上有一个 C++ 示例,以及有人添加的关于如何将其打包以便在 [VB].net 中使用的注释。看起来您需要的“缺失”位是 Win32 函数 GetProductInfo (PInvoke.net reference for this)。

在此和 Avram 的回答之间,您应该能够组装完整版本的字符串。

【讨论】:

@Rob:我的回答基于添加到问题中的“.net”标签 Avram - 是的,你做到了 - 但是,P/Invoke 是 .net 的一部分,并且是(据我所知!)添加到你的答案以获得“版本”的唯一方法" 的一部分,即“终极版”或“家庭高级版”等。 在 Win2003 中失败:无法在 DLL 'kernel32.dll' 中找到名为 'GetProductInfo' 的入口点。 @alhambraeidos,请花时间查看我的答案参考的 msdn 文档。当然它不会起作用,因为 API 是在 Vista/Server2008 中引入的——这是 OPs 问题中建议的“最低操作系统要求”。

以上是关于如何将 MS Windows 操作系统版本号转换为 .NET 中的产品名称?的主要内容,如果未能解决你的问题,请参考以下文章

如何查看windows系统的详细版本号

如何在 Android 上将 MS Office DOC/XLS/PPT 和 PDF 转换为图像

如何查看windows系统的详细版本号

如何查看windows系统的详细版本号

将 MySQL 转换为 MS Access

如何在 MS Access 2010 中将 ACCDB 转换为 MDB