首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何检测Windows2012核心版本(C++)

如何检测Windows2012核心版本(C++)
EN

Stack Overflow用户
提问于 2012-10-25 09:25:01
回答 3查看 1.7K关注 0票数 4

我需要在我的程序中检测到Windows 2012的版本。

在以前的操作系统上,我使用了GetProductInfo的pdwReturnedProductType,但根据msdn:

Windows 2012中不返回PRODUCT_*_SERVER_CORE值。例如,基本服务器 版本,服务器数据中心,用于构建两个不同的安装选项:“完整服务器” 和“核心服务器”使用Windows 2012,GetProductInfo将返回PRODUCT_DATACENTER,而不管产品安装过程中使用的选项如何。

是否还有其他可能检测核心版本?

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-10-26 14:55:45

实际上,我没有找到任何正确的方法来检测。

因此,对于Win 2012,解决方案是检测正在运行的dwm.exe进程(桌面窗口管理器)。它总是在运行,不能被用户杀死,并且不存在于Windows版本中。

票数 0
EN

Stack Overflow用户

发布于 2013-03-13 15:49:50

代码语言:javascript
复制
HKLM\Software\Microsoft\Windows NT\CurrentVersion\Server\ServerLevels\
    ServerCore = 1
    Server-Gui-Mgmt = 1
    Server-Gui-Shell = 1

根据MSDN,使用这些注册表值是一种方法。另一种方法是解析/online /get-features /format:table的输出并查看是否已启用或禁用。如果它是禁用的,那么您就处于服务器核心gui无模式。

票数 2
EN

Stack Overflow用户

发布于 2012-10-25 10:45:02

您可以创建一个程序/函数来测试.NET核心版本中没有出现的特性/库。

代码语言:javascript
复制
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移到类作用域,然后从NonCoreAssembly在ImportNonCoreComponent中创建一个类(我不记得这是如何工作的确切语义)。

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

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

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

确保测试函数在不同的场景和不同的.NET版本中工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13065479

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档