C# 确定 OS 是 Windows 7 或 WIndows Windows Server 2008

C# determine OS is Windows 7 or WIndows Windows Server 2008

我正在使用 .NET framework 3.5 版本,程序必须检测所有 Windows 版本(包括 Windows XP、Windows Vista、Windows 7 , Windows 8, Windows 10, Windows Server 2008, Windows Server 2008 R2, Windows Server 2012).

问题是在以下情况下如何确定OS?

我找到了以下代码,但我无法使用,因为我使用的是 .NET Framework 3.5。

var name = (from x in new ManagementObjectSearcher("SELECT * FROM Win32_OperatingSystem").Get().OfType<ManagementObject>()
                  select x.GetPropertyValue("Caption")).FirstOrDefault();
return name != null ? name.ToString() : "Unknown";

我该如何解决这个问题?

我假设该代码的问题在于它使用了 LINQ。您仍然可以使用 WMI 来检查它,只是不要使用 LINQ。我还认为最好检查 ProductType 而不是 Caption.

using (ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_OperatingSystem"))
{
    foreach (ManagementObject managementObject in searcher.Get())
    {
        uint productType = (uint)managementObject.GetPropertyValue("ProductType");
        // productType will be 1 for workstation, 2 for domain controller,
        // 3 for normal server
    }
}

然后只需检查版本号以确定实际 OS 版本。

另一种方法是使用 registry 并检查密钥 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ProductOptions\ProductType。这将具有值 WinNT、ServerNT 或 LanmanNT,以标记与 WMI 代码相同的选项。

您可以直接从注册表文件中获取信息。它适用于 .net 3.0 及更高版本。

String loc= @"SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion";
RegistryKey key = Registry.LocalMachine;
RegistryKey skey = key.OpenSubKey(loc);
Console.WriteLine("OS Name: {0}", skey.GetValue("ProductName"));