如何将 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 中的产品名称?的主要内容,如果未能解决你的问题,请参考以下文章