【问题标题】:How to detect Windows 2012 Core edition (C++)如何检测 Windows 2012 核心版 (C++)
【发布时间】:2012-10-15 10:52:31
【问题描述】:

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

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

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

【问题讨论】:

  • 为什么?这两个“产品”现在是同一个产品,但安装了不同的组件。
  • 在我的例子中,因为 Core 版本使用了特殊版本的 .NET (microsoft.com/en-us/download/details.aspx?id=22833),这有点不同。某些 .NET Framework 功能不适用于 Server Core。
  • 呃,Server 2008 的 4.0 .Net 框架在 Server 2012 上不是完全多余的吗(包括 4.5)?
  • 和Core版还是有区别的。

标签: c++ core windows-server


【解决方案1】:

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

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# 应用程序的一部分以显示“您需要使用完整服务器”的消息。 (如果他们安装应用程序然后降级到核心,这将起作用)。

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

确保测试功能适用于不同的场景和不同的 .NET 版本。

【讨论】:

  • 这是一个非常有趣的技巧,但它不适合我。我指出了有问题的 C++ 标题。我有以下情况:cpp 部分正在运行,检测到核心版本,然后启动 Managed.exe 或 Managed.NoGUI.exe
【解决方案2】:

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

【讨论】:

  • 我不确定这是否适用于 Windows Server 2012 - 我可以看到 DWM.EXE 在安装了 GUI-MGMT 的核心服务器上运行。
【解决方案3】:
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 模式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-24
    • 1970-01-01
    • 2022-10-12
    • 2018-03-08
    • 1970-01-01
    • 1970-01-01
    • 2015-11-13
    相关资源
    最近更新 更多