识别Windows 2012 Server核心

我想要检测2012年服务器是否已被设置为使用WMI的Core安装。 前面的问题似乎表明我可以从Win32_OperatingSystem中获得OperatingSystemSKU 。 我的Windows 2012核心系统报告OperatingSystemSKU为7.来自另一个问题的文章似乎表明是一个PRODUCT_STANDARD_SERVER,如果有一个核心安装,我应该期望看到一个值0x0000000D而不是PRODUCT_STANDARD_SERVER_CORE。

我在这里错过了什么。 我最终希望创build一个策略并使用项目级目标,以仅将该策略应用于Windows 2012 Server Core安装。

PS C:\Users\zoredache\Documents> gwmi -Query "select OPeratingSystemSKU,Version,ProductType from Win32_OperatingSystem" __GENUS : 2 __CLASS : Win32_OperatingSystem __SUPERCLASS : __DYNASTY : __RELPATH : Win32_OperatingSystem=@ __PROPERTY_COUNT : 3 __DERIVATION : {} __SERVER : __NAMESPACE : __PATH : OperatingSystemSKU : 7 ProductType : 2 Version : 6.2.9200 

在PowerShell中:

 Get-WMIObject Win32_OptionalFeature | where Name -eq 'Server-Gui-Shell' | Select InstallState 

在完整服务器上返回1 ,在服务器核心上安装2。

编辑:

虽然我上面的回答是正确的,但有两个问题:

  1. 在工作站上使用此命令时,它不会返回任何内容,因此您必须为此添加额外的检查。

  2. 这很慢,当我尝试它时,耗时600到3500毫秒。

所以更实用的方法是检查某个文件是否存在:

 (Test-Path "$env:windir\explorer.exe") 

这将为服务器核心安装返回$false ,对所有其他服务器返回$false ,执行时间为1毫秒

有趣的是,你链接的MSDN文章包含答案:

Windows Server 2012中不返回PRODUCT _ * _ SERVER_CORE值。

这是因为只需添加或删除相应的function,Server 2012就可以在“服务器核心”和“完整”安装之间自由转换。

您将需要检查是否存在这些function(例如Server-Gui-Mgmt-Infra,Server-Gui-Shell,Desktop-Experience)。

由于GUI只是一个function,您可以查询已安装function的列表

只需在服务器上的PowerShell中testing这个工作就足够了:

转储function列表以获取名称

 Get-WmiObject Win32_OptionalFeature > features.txt 

searchfeatures.txt的文本告诉我该function被命名为“Server-Gui-Mgmt”(其他function也可以安装在Michael的答案中,所以你也可以testing),我们可以search看看如果有的话

 Get-WmiObject -query "select * from Win32_OptionalFeature where name = 'Server-Gui'" 

在这里输入图像描述

我怀疑,因为它们在2012年基本相同,只有几个可选function来区分它们,所以可以查询function。

本文是Win32_OptionalFeature类的参考,它将允许您查询function。 如本文所述,可选function定义为Server-Gui-Mgmt-Infra,Server-Gui-Shell和Desktop-Experience。

您可以查询其中的3个,并使用布尔AND和NOT逻辑来select没有安装这些function的服务器。

我将使用Win32_ServerFeature,它是一个小得多的类,只包含安装在服务器上的angular色。 查询使用Win32_Serverfunction应该返回更快。

 Get-WmiObject -Query "Select * FROM Win32_ServerFeature WHERE Name = 'Server Graphical Shell'" 

讨论了一些关于本地和远程场景的答案的解释。 提问者询问WMI,他的例子使用PowerShell来调用WMI。 直接从非托pipe代码使用WMI也更快。

请注意,这些方法适用于Server 2012和Server 2012 R2,可能不适用于将来的版本。

一些取决于你的情况折衷…对于大多数情况下,Win32_ServerFeature是首选的一般解决scheme,或本地文件检查捏。

  • 本地文件检查:快速和肮脏。 很less移动部件。
  • MSFT_ServerManagerDeploymentTasks:由Win32_ServerFeature和Get-WindowsFeature使用的底层WMI提供程序。 它使用本地registrycaching,并且通常非常快速地返回,除非自上次查询以来configuration发生更改。 如果caching未命中,则与Win32_OptionalFeature大致相同。 如果您在高速networking上查询大量机器,并且需要大量关于组件与其状态的关系的详细信息,那么这是一个非常好的界面 – 但是对于正常使用来说,这是一个痛苦。 改用Win32_ServerFeature。
  • Win32_ServerFeature:通常是本地或远程查询的最佳select,但不如本地文件检查快。 仅返回已安装的function,并在networking上传输很less的stream量。
  • Get-WindowsFeature:使用非常简单,假设您已经将PowerShell用作呼叫path的一部分。 当对远程目标进行呼叫时,如果你只是想知道是否安装了某个特定的function,那么在整个networking中就会出现超过400K的数据。
  • Win32_OptionalFeature / Get-WindowsOptionalFeature:这个查询在目标上的DISM每一次都可能很重。

涵盖在线本地和远程scheme。 上面的一些也将针对离线图像。

我只是觉得我会用WMI Filter来解决这个问题,所以你可以把GPO应用到Core 2012+系统上:

 SELECT * FROM Win32_OptionalFeature WHERE Caption = "Microsoft-Windows-Server-Gui-Shell-Package-DisplayName" AND InstallState = "2" 

要在命令行上testing这个:

 WMIC PATH Win32_OptionalFeature WHERE "Caption = 'Microsoft-Windows-Server-Gui-Shell-Package-DisplayName' AND InstallState = 2" 

当试图find为Core 2012服务器创buildWMIfilter的方法时,我偶然发现了这个线程,由于某种原因,我没有发现WMI检查Win32_OptionalFeature(或者确实存在这样的path)。 希望这可以帮助别人。

在Windows Server 2012 R2上,我正在使用以下内容,虽然性能仍然非常明显,但性能还是不错的。

 $gui = (Get-WindowsFeature -Name 'Server-Gui-Shell').Installed