C# 使用Environment.OSVersion确定操作系统

C# 使用Environment.OSVersion确定操作系统,c#,asp.net,windows,C#,Asp.net,Windows,使用System.Environment.OSVersion命名空间确定承载ASP.NET应用程序的Microsoft OS的最佳方法是什么 我需要一个Windows XP、Windows Server 2003和Windows Vista的示例 下面是我试图使用伪代码实现的内容 switch(/* Condition for determining OS */) { case "WindowsXP": //Do Windows XP stuff brea

使用
System.Environment.OSVersion
命名空间确定承载ASP.NET应用程序的Microsoft OS的最佳方法是什么

我需要一个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;
}

不是一个完整的列表,但从以下来源获得:

+--------------------------------------------------------------+ ||窗|窗|窗|窗NT |窗|窗| || 95 | 98 | Me | 4.0 | 2000 | XP| +--------------------------------------------------------------+ |平台状| 1 | 1 | 2 | 2 | 2| +--------------------------------------------------------------+ |少校| |版本| 4 | 4 | 4 | 5 | 5| +--------------------------------------------------------------+ |小调| |版本| 0 | 10 | 90 | 0 | 0 | 1| +--------------------------------------------------------------+ 编辑:注意,如果应用程序在兼容模式下运行,System.Environment.OSVersion返回的信息可能不可靠


Edit2:我建议您在应用程序中设置一个可配置的值,这样在新操作系统(如Windows 7)出现时,您的代码就不需要重新编译

以下方法应该有效。但你为什么在乎?只是为了在日志记录中提供信息,还是您正在寻找目标平台上存在的实际功能

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
}

如果您不必对服务器版本的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");
}
抄袭自

更具体地说,你的选择是

  • WMI,则必须进行一些手动解析。不确定用户权限是否会伤害非管理员用户

  • 如中所述

  • 正在检查处的
    ProductName

    HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\
    

  • 我需要为每个操作系统版本做不同的事情。我在想一个开关或if/else语句回答错误!它必须是:如果(Environment.OSVersion.Version.Major>6){/*vista及以上版本*/}我需要根据托管我的windows服务的操作系统生成正确的IE用户代理字符串,那么版本主/次编号是否足够?类似这样:Mozilla/4.0(兼容;MSIE 7.0b;Windows NT 6.0)是否有任何方法可以区分XP64和Server 2003?我同意第二个建议(编辑2注释)。尝试在Windows 10中解决这个问题…对于更新列表,此页面非常有用。
    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");
    }
    
    HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\