如何将 MS Windows 操作系统版本号转换为 .NET 中的产品名称?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/545666/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to translate MS Windows OS version numbers into product names in .NET?
提问by Thomas Bratt
How to translate MS Windows OS version numbers into product names?
如何将 MS Windows 操作系统版本号转换为产品名称?
For example, in .NET the following two properties could be used to work out that the product is MS Windows Vista Ultimate Edition :
例如,在 .NET 中,可以使用以下两个属性来确定产品是 MS Windows Vista Ultimate Edition:
Environment.OSVersion.Platform returns Win32NT
Environment.OSVersion.Platform returns Win32NT
Environment.OSVersion.Version returns 6.0.6001.65536
Environment.OSVersion.Version returns 6.0.6001.65536
回答by Avram
VB:
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
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";
}
回答by Sean Kearon
You can use WMI to get the friendly product name ("Microsoft? Windows Server? 2008 Enterprise "):
您可以使用 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";
回答by Rob
There's a C++ example at msdn http://msdn.microsoft.com/en-us/library/ms724429(VS.85).aspx, along with a note someone's added about how to wrap it up for use in [VB].net. It looks like the "missing" bit you need is the Win32 function GetProductInfo(PInvoke.net reference for this).
msdn http://msdn.microsoft.com/en-us/library/ms724429(VS.85).aspx 上有一个 C++ 示例,以及某人添加的关于如何将其打包以在 [VB] 中使用的注释。网。看起来您需要的“缺失”位是 Win32 函数GetProductInfo(PInvoke.net 对此的参考)。
Between this and the answer from Avram, you should be able to assemble the full version string.
在此与 Avram 的答案之间,您应该能够组装完整版本的字符串。
回答by Mancin Nicola
This is my solution, fastest and without select cases.
这是我的解决方案,速度最快且无需选择案例。
the result may be customized as you want
结果可以根据需要定制
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];
}
}
回答by jqa
If you just want a GUI friendly informational message I used
如果您只想要我使用的 GUI 友好信息消息
My.Computer.Info.OSFullName & " (" + My.Computer.Info.OSVersion + ")"
My.Computer.Info.OSFullName & " (" + My.Computer.Info.OSVersion + ")"
Seems to be future proof for future versions of Windows
似乎是未来 Windows 版本的未来证明

