使用Environment.OSVersion确定操作系统

时间:2009-05-13 21:12:21

标签: c# asp.net windows

使用System.Environment.OSVersion命名空间

确定托管ASP.NET应用程序的Microsoft操作系统的最佳方法是什么?

我需要Windows XP,Windows Server 2003和Windows Vista的示例

以下是我尝试使用伪代码

完成的操作
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 个答案:

答案 0 :(得分:17)

以下内容应该有效。但你为什么关心?仅用于记录日志中的信息目的,还是在寻找目标平台上存在的实际功能?

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
}

答案 1 :(得分:10)

不完整列表,但是从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     |
+--------------------------------------------------------------+

编辑:注意,如果应用程序在兼容模式下运行,System.Environment.OSVersion返回的信息可能不可靠。

Edit2:我建议您在应用程序中将其设置为可配置值 - 这样,当新的操作系统出现时,您的代码不需要重新编译,例如Windows 7.

答案 2 :(得分:3)

如果您不必具体了解服务器版本的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");
}

here复制。

更具体地说,您的选择是,

  1. WMI,您将需要进行一些手动解析。不确定用户权限是否会伤害非管理员用户。

  2. GetVersionEx,如this answer

  3. 中所述
  4. 处检查ProductName
    HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\
    

答案 3 :(得分:2)

if(Environment.OSVersion.Version.Major > 5) { /* vista and above */ }