C++ 如何检测Windows 2012核心版(C+;+;)

C++ 如何检测Windows 2012核心版(C+;+;),c++,core,windows-server,C++,Core,Windows Server,我需要在我的程序中检测Windows 2012上的版本。 在以前的操作系统上,我使用了GetProductInfo的pdwReturnedProductType,但根据msdn: Windows SERVER 2012中不返回产品*\u服务器\\核心值。例如,基本服务器 服务器数据中心版本用于构建两个不同的安装选项:“完整服务器” 和“核心服务器”。对于Windows Server 2012,GetProductInfo将返回PRODUCT\u数据中心 无论在产品安装过程中使用何种选项 是否存在

我需要在我的程序中检测Windows 2012上的版本。
在以前的操作系统上,我使用了GetProductInfo的pdwReturnedProductType,但根据msdn:

Windows SERVER 2012中不返回产品*\u服务器\\核心值。例如,基本服务器
服务器数据中心版本用于构建两个不同的安装选项:“完整服务器”
和“核心服务器”。对于Windows Server 2012,GetProductInfo将返回PRODUCT\u数据中心 无论在产品安装过程中使用何种选项

是否存在检测核心版本的其他可能性?

谢谢。

您可以创建一个程序/函数,用于测试.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移到类作用域,然后在importnoncomponent中从noncorepassembly创建一个类(我记不起这是如何工作的确切语义)

注意:using语句需要与测试函数隔离。当JIT编译器处理它时,它将抛出一个异常。测试函数不会处理该异常,因此try…catch语句需要位于调用它的方法中

您可以使用此技术在MSI中实现一个自定义操作,以便在安装过程中失败,或者将其作为C#应用程序的一部分,显示一条消息,说明“您需要使用完整的服务器”(如果他们安装了应用程序,然后降级到核心,这将起作用)

如果差异是行为上的,您可以在测试函数中检查该行为


确保测试功能在不同的场景和不同的.NET版本下工作。

实际上,我没有找到任何正确的方法来检测Windows Core Edition。
因此,Win 2012的解决方案是检测dwm.exe进程是否正在运行(桌面窗口管理器)。它始终在运行,不能被用户删除,并且不存在于Windows核心版本中

HKLM\Software\Microsoft\Windows NT\CurrentVersion\Server\ServerLevels\
    ServerCore = 1
    Server-Gui-Mgmt = 1
    Server-Gui-Shell = 1
据了解,使用这些注册表值是一种方法。
另一种方法是解析dism
/online/get features/format:table的输出,并查看feature ServerCore FullServer是启用还是禁用的。如果它被禁用,则您处于servercore无gui模式

为什么??这两个“产品”现在是相同的产品,但安装了不同的组件。有些.NET Framework功能在Server Core上不起作用。呃,Server 2008的4.0.NET Framework在Server 2012(附带4.5)上不是完全多余吗?它仍然不同于Core edition。这是一个非常有趣的技巧,但不适合我。我指出了问题头中的C++。我有以下场景:cpp部件正在运行,检测Core edition,然后启动Managed.exe或Managed.NoGUI.exe。我不确定这对于Windows Server 2012是否正确-我可以看到DWM.exe在安装了GUI-MGMT的Core服务器上运行。