WinForms应用程序如何确定运行的是哪个Windows操作系统?

6
我有一个WinForms应用程序,需要根据操作系统的不同表现出特定的行为(具体来说是针对某个安装程序进行操作)。
我正在使用System.OperatingSystem类,并结合PlatFormID、Major、Minor和Build号码来实现这一目的。
不幸的是,OperatinSystem对象的属性无法精确地区分某些平台。例如,Vista和Windows Server 2008,或者Vista 32位和Vista 64位。同样,XP 64位专业版似乎与Server 2003具有相同的版本信息。
因此,是否可能从WinForms应用程序(使用c#)准确确定您正在运行哪个Windows操作系统?

1
XP 64在实际用途上相当于Server 2003。因此,您只需要找到一种区分64位和32位的方法-对吗? - John Knoeller
1
检查一下这个网页...https://dev59.com/enVD5IYBdhLWcg3wL4mM - t0mm13b
5个回答

4

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

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

如果您在32位Windows上运行此代码,value将为“x86”或为空。在64位Windows上,我假设它将被设置为除“x86”之外的任何内容。有点混乱,但到目前为止,在所有可以执行.NET程序的Windows版本上都可以工作。
您还可以使用更现代的WMI查询关于操作系统的几乎所有信息,但这仅适用于Windows 2000或更新版本。如果您可以接受这一点,请参考此博客文章中的一些示例

1
感谢您链接到我的博客!+1 :-D - Andrew Ensley

4

您可以使用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);
            }
        }
    }
}

2

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

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

1
谢谢。我也使用了那些信息,但是在尝试区分Vista32和Vista64等时存在一些冲突。 - Stuart Helwig

1

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

string os = Environment.OSVersion.VersionString;

对于我的操作系统,上述代码返回以下结果:

Microsoft Windows NT 6.1.7600.0

希望这能帮到你。


谢谢。我已经尝试过这个设置,但它不能区分32位和64位。我的解决方案最终将使用所有这些答案的一点,所以感谢大家。 - Stuart Helwig

1
如果你真的需要所有细节,我想你仍然可以使用Win32 API中好用的GetVersionEx
实际上这不是.NET(严格来说),但在.NET应用程序中可用。请参见此处

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接