我需要在我的程序中检测到Windows 2012的版本。
在以前的操作系统上,我使用了GetProductInfo的pdwReturnedProductType,但根据msdn:
Windows 2012中不返回PRODUCT_*_SERVER_CORE值。例如,基本服务器 版本,服务器数据中心,用于构建两个不同的安装选项:“完整服务器” 和“核心服务器”使用Windows 2012,GetProductInfo将返回PRODUCT_DATACENTER,而不管产品安装过程中使用的选项如何。
是否还有其他可能检测核心版本?
谢谢。
发布于 2012-10-26 14:55:45
实际上,我没有找到任何正确的方法来检测。
因此,对于Win 2012,解决方案是检测正在运行的dwm.exe进程(桌面窗口管理器)。它总是在运行,不能被用户杀死,并且不存在于Windows版本中。
发布于 2013-03-13 15:49:50
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无模式。
发布于 2012-10-25 10:45:02
您可以创建一个程序/函数来测试.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移到类作用域,然后从NonCoreAssembly在ImportNonCoreComponent中创建一个类(我不记得这是如何工作的确切语义)。
注意: using语句需要隔离到测试函数。当JIT编译器处理它时,它将抛出一个异常。该异常将不会由测试函数处理,因此try...catch语句需要在调用它的方法中。
您可以使用此技术在MSI中实现自定义操作,使其在安装过程中失败,或者将其用作C#应用程序的一部分,以显示一条消息:“您需要使用完整的服务器”。(如果他们安装了应用程序,然后降级到Core,这就可以了)。
如果差异是行为的,你可以在你的测试功能中检查这种行为。
确保测试函数在不同的场景和不同的.NET版本中工作。
https://stackoverflow.com/questions/13065479
复制相似问题