This question already has an answer here:
这个问题在这里已有答案:
- Detect Windows version in .net 13 answers
- 在.net 13答案中检测Windows版本
What is the best to determine the Microsoft OS that is hosting your ASP.NET application using the System.Environment.OSVersion
namespace
使用System.Environment.OSVersion命名空间确定托管ASP.NET应用程序的Microsoft OS的最佳方法是什么
I need an example for Windows XP, Windows Server 2003 and Windows Vista
我需要一个Windows XP,Windows Server 2003和Windows Vista的示例
Here is what I am trying to accomplish using pseudocode
这是我试图使用伪代码完成的
switch(/* Condition for determining OS */)
{
case "WindowsXP":
//Do Windows XP stuff
break;
case "Windows Server 2003":
//Do Windows Server 2003 stuff
break;
case "Windows Vista":
//Do Windows Vista stuff
break;
}
4 个解决方案
#1
17
The following should work. But why do you care? Is just for informational purposes in logging or are you looking for actual capabilities being present on the target platform?
以下应该有效。但你为什么关心?仅用于日志记录中的信息目的,还是您正在寻找目标平台上存在的实际功能?
if (Environment.OSVersion.Version.Major == 5)
{
if (Environment.OSVersion.Version.Minor == 1)
{
// XP
}
else if (Environment.OSVersion.Version.Minor == 2)
{
// Server 2003. XP 64-bit will also fall in here.
}
}
else if (Environment.OSVersion.Version.Major >= 6)
{
// Vista on up
}
#2
10
Not a complete list, but got this from http://support.microsoft.com/kb/304283:
不完整的列表,但从http://support.microsoft.com/kb/304283得到这个:
+--------------------------------------------------------------+ | |Windows|Windows|Windows|Windows NT|Windows|Windows| | | 95 | 98 | Me | 4.0 | 2000 | XP | +--------------------------------------------------------------+ |PlatformID | 1 | 1 | 1 | 2 | 2 | 2 | +--------------------------------------------------------------+ |Major | | | | | | | | version | 4 | 4 | 4 | 4 | 5 | 5 | +--------------------------------------------------------------+ |Minor | | | | | | | | version | 0 | 10 | 90 | 0 | 0 | 1 | +--------------------------------------------------------------+
Edit: Note, the information returned by System.Environment.OSVersion may be unreliable if the application is running in compatibility mode.
编辑:注意,如果应用程序在兼容模式下运行,则System.Environment.OSVersion返回的信息可能不可靠。
Edit2: I would recommend you just make it a configurable value in your application - that way your code does not need recompilation when a new OS comes out, e.g., Windows 7.
Edit2:我建议你在应用程序中使它成为一个可配置的值 - 这样你的代码就不需要在新的操作系统出来时重新编译,例如Windows 7。
#3
3
If you dont have to be specific about R2 of server editions, a simpler alternative is:
如果您不必具体了解服务器版本的R2,则更简单的替代方案是:
enum OS { _2000, XP, Server2003, Vista, Server2008, _7, Server2012, _8 }
const int OS_ANYSERVER = 29;
[DllImport("shlwapi.dll", SetLastError = true, EntryPoint = "#437")]
static extern bool IsOS(int os);
static bool isWindowsServer = IsOS(OS_ANYSERVER);
public static OS GetOS()
{
var version = Environment.OSVersion.Version;
switch (version.Major)
{
case 5:
switch (version.Minor)
{
case 0:
return OS._2000;
case 1:
return OS.XP;
case 2:
return isWindowsServer ? OS.Server2003 : OS.XP;
}
break;
case 6:
switch (version.Minor)
{
case 0:
return isWindowsServer ? OS.Server2008 : OS.Vista;
case 1:
return isWindowsServer ? OS.Server2008 : OS._7;
case 2:
return isWindowsServer ? OS.Server2012 : OS._8;
}
break;
}
throw new Exception("Strange OS");
}
Copied from here.
从这里复制。
To be more specific your options are,
更具体地说,你的选择是,
-
WMI, you will have to some manual parsing. Not sure if user privilege is going to hurt non admin users.
WMI,您将需要进行一些手动解析。不确定用户权限是否会伤害非管理员用户。
-
GetVersionEx as described in this answer.
GetVersionEx如本答案中所述。
-
Checking for
ProductName
at在。检查ProductName
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\
#4
2
if(Environment.OSVersion.Version.Major > 5) { /* vista and above */ }
#1
17
The following should work. But why do you care? Is just for informational purposes in logging or are you looking for actual capabilities being present on the target platform?
以下应该有效。但你为什么关心?仅用于日志记录中的信息目的,还是您正在寻找目标平台上存在的实际功能?
if (Environment.OSVersion.Version.Major == 5)
{
if (Environment.OSVersion.Version.Minor == 1)
{
// XP
}
else if (Environment.OSVersion.Version.Minor == 2)
{
// Server 2003. XP 64-bit will also fall in here.
}
}
else if (Environment.OSVersion.Version.Major >= 6)
{
// Vista on up
}
#2
10
Not a complete list, but got this from http://support.microsoft.com/kb/304283:
不完整的列表,但从http://support.microsoft.com/kb/304283得到这个:
+--------------------------------------------------------------+ | |Windows|Windows|Windows|Windows NT|Windows|Windows| | | 95 | 98 | Me | 4.0 | 2000 | XP | +--------------------------------------------------------------+ |PlatformID | 1 | 1 | 1 | 2 | 2 | 2 | +--------------------------------------------------------------+ |Major | | | | | | | | version | 4 | 4 | 4 | 4 | 5 | 5 | +--------------------------------------------------------------+ |Minor | | | | | | | | version | 0 | 10 | 90 | 0 | 0 | 1 | +--------------------------------------------------------------+
Edit: Note, the information returned by System.Environment.OSVersion may be unreliable if the application is running in compatibility mode.
编辑:注意,如果应用程序在兼容模式下运行,则System.Environment.OSVersion返回的信息可能不可靠。
Edit2: I would recommend you just make it a configurable value in your application - that way your code does not need recompilation when a new OS comes out, e.g., Windows 7.
Edit2:我建议你在应用程序中使它成为一个可配置的值 - 这样你的代码就不需要在新的操作系统出来时重新编译,例如Windows 7。
#3
3
If you dont have to be specific about R2 of server editions, a simpler alternative is:
如果您不必具体了解服务器版本的R2,则更简单的替代方案是:
enum OS { _2000, XP, Server2003, Vista, Server2008, _7, Server2012, _8 }
const int OS_ANYSERVER = 29;
[DllImport("shlwapi.dll", SetLastError = true, EntryPoint = "#437")]
static extern bool IsOS(int os);
static bool isWindowsServer = IsOS(OS_ANYSERVER);
public static OS GetOS()
{
var version = Environment.OSVersion.Version;
switch (version.Major)
{
case 5:
switch (version.Minor)
{
case 0:
return OS._2000;
case 1:
return OS.XP;
case 2:
return isWindowsServer ? OS.Server2003 : OS.XP;
}
break;
case 6:
switch (version.Minor)
{
case 0:
return isWindowsServer ? OS.Server2008 : OS.Vista;
case 1:
return isWindowsServer ? OS.Server2008 : OS._7;
case 2:
return isWindowsServer ? OS.Server2012 : OS._8;
}
break;
}
throw new Exception("Strange OS");
}
Copied from here.
从这里复制。
To be more specific your options are,
更具体地说,你的选择是,
-
WMI, you will have to some manual parsing. Not sure if user privilege is going to hurt non admin users.
WMI,您将需要进行一些手动解析。不确定用户权限是否会伤害非管理员用户。
-
GetVersionEx as described in this answer.
GetVersionEx如本答案中所述。
-
Checking for
ProductName
at在。检查ProductName
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\
#4
2
if(Environment.OSVersion.Version.Major > 5) { /* vista and above */ }