4

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

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

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

4

3 回答 3

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 模式。

于 2013-03-13T15:49:50.497 回答
0

您可以创建一个程序/函数来测试 .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 版本。

于 2012-10-25T10:45:02.980 回答
0

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

于 2012-10-26T14:55:45.020 回答