【问题标题】:What is the best way for a WinForms application to determine exactly which Windows operating system it is running on?WinForms 应用程序准确确定它在哪个 Windows 操作系统上运行的最佳方法是什么?
【发布时间】:2011-01-15 13:03:03
【问题描述】:

我有一个 WinForms 应用程序,它需要根据其运行的操作系统以特定方式运行(特别是某个安装程序的外壳)。

我正在使用 System.OperatingSystem 类,并结合了 PlatFormID、Major、Minor 和 Build 编号,这可以帮助您顺利完成任务。

不幸的是,OperatinSystem 对象的特性不允许您精确区分某些平台。例如。 Vista 和 Windows Server 2008,或 Vista 32 位和 Vista 64 位。同样,XP 64 位 Professional 似乎具有与 Server 2003 相同的版本信息。

那么是否可以通过 WinForms 应用程序(使用 c#)准确地确定您在哪个 Windows 操作系统上运行?

【问题讨论】:

标签: c# windows winforms operating-system


【解决方案1】:

区分32位和64位最简单的方法是通过环境变量PROCESSOR_ARCHITECTURE

string value = Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE");

如果您在 32 位 Windows 上运行此代码,value 将为“x86”或为空。在 64 位 Windows 上,我假设它将设置为“x86”以外的任何内容。有点乱,但到目前为止它适用于所有可以执行 .NET 程序的 Windows 版本。

您还可以使用更现代的 WMI 来查询几乎所有您可以想象的操作系统信息,但这仅适用于 Windows 2000 或更新版本。如果你能忍受,check this blog post for some examples

【讨论】:

  • 感谢您链接到我的博客! +1 :-D
【解决方案2】:

您可以使用 WMI 检索Win32_OperatingSystem 管理类的信息。

使用WMI Code Creator 生成的代码:

using System;
using System.Management;
using System.Windows.Forms;

namespace WMISample
{
    public class MyWMIQuery
    {
        public static void Main()
        {
            try
            {
                ManagementObjectSearcher searcher = 
                    new ManagementObjectSearcher("root\\CIMV2", 
                    "SELECT * FROM Win32_OperatingSystem"); 

                foreach (ManagementObject queryObj in searcher.Get())
                {
                    Console.WriteLine("-----------------------------------");
                    Console.WriteLine("Win32_OperatingSystem instance");
                    Console.WriteLine("-----------------------------------");
                    Console.WriteLine("BuildNumber: {0}", queryObj["BuildNumber"]);
                    Console.WriteLine("Caption: {0}", queryObj["Caption"]);
                    Console.WriteLine("OSArchitecture: {0}", queryObj["OSArchitecture"]);
                    Console.WriteLine("OSLanguage: {0}", queryObj["OSLanguage"]);
                    Console.WriteLine("Version: {0}", queryObj["Version"]);
                }
            }
            catch (ManagementException e)
            {
                MessageBox.Show("An error occurred while querying for WMI data: " + e.Message);
            }
        }
    }
}

【讨论】:

    【解决方案3】:

    这是我大约一年前为我公司的旧版应用程序所做的事情......我不知道这是最新的方法,但它确实有效。

    If Environment.OSVersion.Platform = PlatformID.Win32NT Then
            If major <= 4 Then
                ret = "Windows NT 4.0"
                _usingNT4 = True
            ElseIf major > 6 Then
                ret = "Windows Vista"
            ElseIf major = 5 And minor = 0 Then
                ret = "Windows 2000"
            Else
                ret = "Windows XP"
            End If
        Else
            If major > 4 Or (major = 4 And minor >= 90) Then
                ret = "Windows ME"
            ElseIf (major = 4 And minor >= 10 And minor < 90) Then
                ret = "Windows 98"
            Else
                ret = "Windows 95"
            End If
        End If
    

    【讨论】:

    • 谢谢。我也使用过该信息,但在尝试区分 Vista32 和 Vista64 等时存在一些冲突。
    【解决方案4】:

    如果你真的需要所有的细节,我想你仍然可以使用 Win32 API 的老式 GetVersionEx

    事实上,这不是 .NET(严格来说),但可以在 .NET 应用程序中使用。见here

    【讨论】:

      【解决方案5】:

      这里有一个更简单的方法:

      string os = Environment.OSVersion.VersionString;
      

      ...对于我的操作系统,上面返回以下内容:

      微软视窗 NT 6.1.7600.0

      希望这会有所帮助。

      【讨论】:

      • 谢谢。我玩过这个设置,但它不区分 32 位和 64 位。不过,我的解决方案最终将使用所有这些答案中的一部分,所以感谢大家。
      猜你喜欢
      • 2022-08-06
      • 1970-01-01
      • 1970-01-01
      • 2010-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多