我需要在我的程序中检测Windows 2012上的版本 在之前的操作系统中,我使用了GetProductInfo的pdwReturnedProductType,但根据msdn:
在Windows Server 2012中不返回PRODUCT _ * _ SERVER_CORE值。例如,基本服务器
版本,Server Datacenter,用于构建两个不同的安装选项:“full server”
和“核心服务器”。在Windows Server 2012中,GetProductInfo将返回PRODUCT_DATACENTER 无论在产品安装过程中使用哪种选项。
还有其他检测核心版本的可能性吗? 感谢。
答案 0 :(得分:2)
HKLM\Software\Microsoft\Windows NT\CurrentVersion\Server\ServerLevels\
ServerCore = 1
Server-Gui-Mgmt = 1
Server-Gui-Shell = 1
根据MSDN使用这些注册表值是一种方法。
另一种方法是解析dism /online /get-features /format:table
的输出,看看是否启用或禁用了功能ServerCore-FullServer。如果它被禁用,那么你处于servercore gui-less模式。
答案 1 :(得分:0)
您可以创建一个程序/函数来测试.NET核心版本中不存在的功能/库。例如:
using System;
public class CoreChecker
{
public static void Main(string args[])
{
try
{
ImportNonCoreComponent();
Console.WriteLine("NonCoreAssembly found... this is full server.");
}
catch (Exception e)
{
Console.WriteLine("NonCoreAssembly not found... this is core server.");
}
}
public static void ImportNonCoreComponent()
{
using NonCoreAssembly;
}
}
如果这不起作用,则需要将using移动到类范围,然后在ImportNonCoreComponent中从NonCoreAssembly创建一个类(我无法回想起它的工作原理的确切语义)。
注意:需要将using语句与测试函数隔离。当JIT编译器处理它时,它将抛出异常。测试函数不会处理该异常,因此try ... catch语句需要位于调用它的方法中。
您可以使用此技术在MSI中实现自定义操作以在安装期间失败,或者将其用作C#应用程序的一部分以显示“您需要使用完整服务器”的消息。 (如果他们安装应用程序然后降级到Core,它将起作用。)
如果区别在于行为,您可以在测试功能中检查该行为。
确保测试功能适用于不同的场景和不同的.NET版本。
答案 2 :(得分:0)
实际上,我没有找到任何正确的方法来检测Windows Core Edition 因此,对于Win 2012,解决方案是检测dwm.exe进程正在运行(桌面窗口管理器)。它始终在运行,不能被用户杀死,也不存在于Windows Core版本中。