我想要检测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。
编辑:
虽然我上面的回答是正确的,但有两个问题:
在工作站上使用此命令时,它不会返回任何内容,因此您必须为此添加额外的检查。
这很慢,当我尝试它时,耗时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,或本地文件检查捏。
涵盖在线本地和远程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