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?
- Windows Vista 和 Windows Server 2008 版本号均为 6.0.
- Windows7和WindowsServer 2008 R2版本号都是6.1.
- Windows8和WindowsServer 2012版本号都是6.2.
我找到了以下代码,但我无法使用,因为我使用的是 .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"));
我正在使用 .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?
- Windows Vista 和 Windows Server 2008 版本号均为 6.0.
- Windows7和WindowsServer 2008 R2版本号都是6.1.
- Windows8和WindowsServer 2012版本号都是6.2.
我找到了以下代码,但我无法使用,因为我使用的是 .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"));