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

时间:2012-10-25 09:25:02

标签: c++ core windows-server

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

  

在Windows Server 2012中不返回PRODUCT _ * _ SERVER_CORE值。例如,基本服务器
      版本,Server Datacenter,用于构建两个不同的安装选项:“full server”
      和“核心服务器”。在Windows Server 2012中,GetProductInfo将返回PRODUCT_DATACENTER       无论在产品安装过程中使用哪种选项。

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

3 个答案:

答案 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版本中。