我想检测是否已使用 WMI 将 2012 服务器设置为核心安装。较早的问题似乎表明我可以从 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
在 PowerShell 中:
在完整服务器上返回1 ,在服务器核心安装上返回2 。
编辑:
虽然我上面的回答是正确的,但它有两个问题:
在工作站上使用此命令时,它不会返回任何内容,因此您必须为此添加额外的检查。
它很慢,当我尝试它时,它花了 600 到 3500 毫秒。
所以更实用的方法是只检查某个文件是否存在:
$false
对于服务器核心安装和$true
所有其他安装,这将返回,并且执行需要一毫秒。有趣的是,您链接的那篇 MSDN 文章包含答案:
这是因为 Server 2012 可以在“服务器核心”和“完整”安装之间自由转换,只需添加或删除相应的功能即可。
您将需要检查这些功能是否存在(例如 Server-Gui-Mgmt-Infra、Server-Gui-Shell、Desktop-Experience)。
由于 GUI 只是一个功能,您可以查询已安装功能的列表
只需在服务器上的 powershell 中测试它就足够了:
转储功能列表以获取名称
搜索 features.txt 的文本告诉我该功能被命名为“Server-Gui-Mgmt”(其他功能也可能已安装,正如迈克尔在他的回答中指出的那样,因此您也可以测试这些功能),我们可以搜索查看如果那存在
我会使用 Win32_ServerFeature,它是一个小得多的类,并且只包含安装在服务器上的角色。使用 Win32_Server 功能的查询应该更快返回。
我怀疑由于它们在 2012 年基本相同,只有一些可选功能可以将它们分开,因此您可以查询这些功能。
本文是 Win32_OptionalFeature 类的参考,可让您查询功能。如本文所述,可选功能定义为 Server-Gui-Mgmt-Infra、Server-Gui-Shell 和 Desktop-Experience 。
您可以查询其中 3 个并使用布尔 AND 和 NOT 逻辑来选择没有安装这些功能的服务器。
在讨论性能时,对本地和远程场景的答案进行了一些澄清。提问者询问 WMI,他的示例使用 PowerShell 调用 WMI。直接从非托管代码中使用 WMI 也更快。
请注意,这些方法有效地适用于 Server 2012 和 Server 2012 R2,并且可能不适用于未来的版本。
根据您的方案进行一些权衡...对于大多数情况,首选 Win32_ServerFeature 作为通用解决方案,或者在紧要关头检查本地文件。
这涵盖了在线本地和远程场景。上面的一些也将针对离线图像。
我只是想我会为这个解决方案添加一个 WMI 过滤器,因此您可以将 GPO 应用于 Core 2012+ 系统:
要在命令行上对此进行测试:
当我试图找到一种为 Core 2012 服务器创建 WMI 过滤器的方法时,我偶然发现了这个线程,并且由于某种原因,我没有想到让 WMI 检查 Win32_OptionalFeature(或者确实存在这样的路径)。希望这对其他人有帮助。
在 Windows Server 2012 R2 上,我使用以下,性能很好,同时仍然非常明确。