【问题标题】:Determine OS using Environment.OSVersion [duplicate]使用 Environment.OSVersion 确定操作系统 [重复]
【发布时间】:2010-10-26 00:25:49
【问题描述】:

使用 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;
}

【问题讨论】:

    标签: c# asp.net windows


    【解决方案1】:

    以下应该有效。但你为什么在乎?仅用于记录信息的目的,还是您正在寻找目标平台上存在的实际功能?

    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
    }
    

    【讨论】:

    • 我需要根据托管我的 Windows 服务的操作系统生成正确的 IE 用户代理字符串
    • 那么版本主要/次要编号不够吗?像这样:Mozilla/4.0(兼容;MSIE 7.0b;Windows NT 6.0)
    • 有什么方法可以区分 XP64 和 Server 2003?
    【解决方案2】:

    不是一个完整的列表,但从http://support.microsoft.com/kb/304283得到这个:

    +-------------------------------------------------- -------------+ | |Windows|Windows|Windows|Windows NT|Windows|Windows| | | 95 | 98 |我 | 4.0 | 2000 |经验 | +-------------------------------------------------- -------------+ |平台ID | 1 | 1 | 1 | 2 | 2 | 2 | +-------------------------------------------------- -------------+ |专业 | | | | | | | |版本 | 4 | 4 | 4 | 4 | 5 | 5 | +-------------------------------------------------- -------------+ |次要 | | | | | | | |版本 | 0 | 10 | 90 | 0 | 0 | 1 | +-------------------------------------------------- -------------+

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

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

    【讨论】:

    • 我同意第二个建议(编辑 2 注释)。
    • 试图为 Windows 10 解决这个问题...
    • 对于更新列表,此页面很有用Operating System Version
    【解决方案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. GetVersionExthis answer 中所述。

    3. ProductName 处检查

      HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\
      

    【讨论】:

      【解决方案4】:
      if(Environment.OSVersion.Version.Major > 5) { /* vista and above */ }
      

      【讨论】:

      • 我需要为每个操作系统版本做不同的事情。我在想一个 switch 或 if/else 语句
      • 错误答案!必须是:if(Environment.OSVersion.Version.Major > 6) { /* vista 及以上 */ }
      猜你喜欢
      • 1970-01-01
      • 2018-04-20
      • 1970-01-01
      • 2013-01-02
      • 1970-01-01
      • 2013-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多