如何检测Windows 2012 Core Edition(C )

How to detect Windows 2012 Core edition (C++)

本文关键字:Core Edition 2012 Windows 检测 何检测      更新时间:2023-10-16

我需要在我的程序中检测到Windows 2012上的版本。
在上一个操作系统上,我使用了getProductinfo的pdwreturnedproducttype,但根据MSDN:

产品_*_ server_core值在Windows Server 2012中未返回。例如,基本服务器
服务器数据中心版本用于构建两个不同的安装选项:"完整服务器"
和"核心服务器"。使用Windows Server 2012,GetProductInfo将返回product_datacenter 无论产品安装过程中使用的选项如何。

还有其他可能检测核心版本的可能性吗?
谢谢。

HKLMSoftwareMicrosoftWindows NTCurrentVersionServerServerLevels
    ServerCore = 1
    Server-Gui-Mgmt = 1
    Server-Gui-Shell = 1

根据MSDN使用这些注册表值是一种方法。另一个是解析DIMS /online /get-features /format:table的输出,看看是否启用或禁用了功能ServerCore-fullserver。如果它禁用了它,则您处于ServerCore Gui-nose模式。

您可以创建一个程序/函数,该程序/功能为.NET的Core Edition中不存在的功能/库来测试。例如:

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;
    }
}

如果这不起作用,则需要将使用的使用移至类范围,然后从entimentnoncorecomponent中的noncoreassembly创建一个类(我不记得它如何工作的确切语义)。

注意:需要将使用语句隔离到测试功能。当JIT编译器对其进行处理时,它将引发例外。该例外将不会由测试功能处理,因此尝试... catch语句需要在称为它的方法中。

您可以使用此技术在MSI中实现自定义操作以在安装过程中失败,或将其用作C#应用程序的一部分,以传达一条消息,说"您需要使用完整的服务器"。(如果他们安装应用程序然后降级为核心,则可以工作)。

如果差异是行为的,则可以在测试功能中检查该行为。

确保测试功能在不同的方案和不同的.NET版本中起作用。

实际上,我找不到任何正确的方法来检测Windows Core Edition。
因此,对于WIN 2012来说,该解决方案是为了检测DWM.EXE流程正在运行(桌面窗口管理器)。它总是在运行,不能被用户杀死,也不存在于Windows Core版本上。