识别Windows 2012 Server核心


18

我想检测是否已使用WMI将2012服务器设置为Core安装。一个更早的问题似乎表明我可以从Win32_OperatingSystem获取OperatingSystemSKU。我的Windows 2012 Core系统报告的OperatingSystemSKU为7。另一个问题的文章似乎表明是PRODUCT_STANDARD_SERVER,如果安装了内核,我应该期望PRODUCT_STANDARD_SERVER_CORE的值为0x0000000D。

我在这里想念什么。我最终希望创建一个策略,并使用项目级别定位将该策略仅应用于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

对您的问题略有偏颇...如何定义服务器核心?我读到服务器核心是相同的,只安装了一个或两个更少的功能(GUI)。您可以不查询吗?
约翰,

如果您可以提供有关如何检测通过WMI安装该功能的答案,那么我将对其进行投票并进行测试。我认为,任何可用于识别带有WMI的服务器核心的答案都是有帮助的。
Zoredache

尝试在远程计算机上使用WMI。Get-WMIObject Win32_OptionalFeature | Select Name, InstallState并过滤服务器上是否安装了服务器GUI位。
瑞安·里斯

Answers:


24

在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对于服务器核心安装和$true所有其他安装,这将返回,并且执行需要一毫秒


很好的答案-我特别喜欢您提供的变通办法及所有解释;)完美。
TomTom 2014年

6

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

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

这是因为,只需添加或删除适当的功能,即可在“ Server Core”和“ full”安装之间自由转换Server 2012。

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


5

由于GUI只是一项功能,因此您可以查询已安装功能的列表

只需在服务器上的Powershell中对此进行测试就可以很好地工作:

转储功能列表以获取名称

Get-WmiObject Win32_OptionalFeature > features.txt

搜索features.txt的文本可知该功能名为“ Server-Gui-Mgmt”(其他功能也可能按照迈克尔在回答中提到的方式安装,因此您也可以对其进行测试),我们可以进行搜索以查看如果存在

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

在此处输入图片说明


2

我怀疑由于它们在2012年基本相同,只有几个可选功能将它们区分开,因此您可以查询这些功能。

本文是Win32_OptionalFeature类的参考,该类使您可以查询功能。可选的功能被定义为服务器桂MGMT-红外,服务器-桂-壳牌和桌面体验,简列如这篇文章

您可以查询其中的三个,并使用布尔AND和NOT逻辑来选择未安装这些功能的服务器。


2

我将使用Win32_ServerFeature,它是一个小得多的类,仅包含服务器上安装的角色。使用Win32_Server功能的查询应该返回得更快。

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

2

讨论了有关作为性能的本地和远程方案的答案的一些说明。发问者询问WMI,他的示例使用PowerShell调用WMI。直接从非托管代码使用WMI也更快。

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

在某些情况下需要进行权衡取舍...在大多数情况下,首选Win32_ServerFeature作为常规解决方案,或者在紧急情况下检查本地文件。

  • 本地文件检查:快速又脏。运动部件很少。
  • MSFT_ServerManagerDeploymentTasks:Win32_ServerFeature和Get-WindowsFeature使用的基础WMI提供程序。它使用本地注册表缓存,并且通常会非常快速地返回,除非自上次查询以来未进行任何配置更改。如果发生高速缓存未命中,则与Win32_OptionalFeature大致相同。如果您要查询快速网络上的大量计算机,并且需要大量有关组件关系及其状态的详细信息,这是一个很好的界面-但是对于正常使用而言,这是一个痛苦。请改用Win32_ServerFeature。
  • Win32_ServerFeature:通常是本地或远程查询的最佳选择,但不如本地文件检查那么快。仅返回已安装的功能,并且网络上的流量很少。
  • Get-WindowsFeature:非常简单,假设您已经使用PowerShell作为调用路径的一部分。当呼叫远程目标时,这会使整个网络超过40万,这在您只想知道是否安装了特定功能时就显得过分了。
  • Win32_OptionalFeature / Get-WindowsOptionalFeature:每次都在目标上查询DISM,这可能非常繁重。

涵盖在线本地和远程方案。上述内容中的一些也将针对脱机映像。


1

我只是想为该解决方案提供一个WMI筛选器,因此您可以将GPO应用于Core 2012+系统:

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

要在命令行上对此进行测试:

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

当试图找到一种为Core 2012服务器创建WMI筛选器的方法时,我偶然发现了该线程,由于某种原因,让WMI检查Win32_OptionalFeature(或者确实存在这样的路径)对我而言并没有发生。希望这对其他人有帮助。


0

在Windows Server 2012 R2上,我使用的是以下内容,性能仍然不错,但仍然很明确。

$gui = (Get-WindowsFeature -Name 'Server-Gui-Shell').Installed
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.