检查 HyperV 是否为 运行 的正确方法是什么?

What is the proper way to check if HyperV is running?

我正在尝试编写一个 powershell 脚本来安装和设置 Hyper-V 机器。安装似乎没问题,但是,我从系统得到了相互矛盾的响应。 基本上,我使用 (gcim Win32_ComputerSystem).HypervisorPresent 来确定 HyperV 是否 运行ning.

它return .

有一个相似的 class 和同一个成员 (gcim CIM_ComputerSystem).HypervisorPresent 什么也是 returning False.

还发现了这个问题您如何检查是否使用 PowerShell 启用了 Hyper-V? 并且此状态 属性 是 Enabled

我错过了什么吗?这些查询不一样?如果其中任何一个被弃用,你能指出吗? 我是不是完全被愚弄了,启用意味着系统能够 运行 HyperV,但实际上它不是 运行ning?

CIM 和 WMI 说来话长,但简短的总结是 WMI 是 Microsoft 对 OMI 标准的实施,该标准由 DMTF(分布式管理任务组)定义,旨在提出一个行业范围的标准。因此,当然,创建一个新标准会导致一堆不同的实现,这些实现基本上都是他们自己的标准。

但除此之外,CIM 和 WMI 可以被认为是 Windows 计算机获取相同信息的不同网关。同一所房子的不同门。 More on that history and the distinctions here.

当我 运行 你在我的机器上使用 Hyper-V 共享的 PowerShell 命令(其中一个)时,即使 运行 作为标准的非管理员用户,我得到True 两人都回来了。

您还可以通过查看 CIM_Processor class.

检查 BIOS 固件是否启用了虚拟化
(Get-CimInstance win32_processor).VirtualizationFirmwareEnabled
True

您还可以检查是否安装了 Windows 功能,但这并不能为您提供完整的图片(如果在应用于机器的图像中启用了 Windows 功能会怎样例如,没有在 BIOS 中启用虚拟化组件。)

[ADMIN] C:\>(Get-WindowsOptionalFeature -FeatureName Microsoft-Hyper-V-All -Online).State
Enabled

此外,该技术需要管理员权限。

另一种方法,也许最简单的方法是检查 Hyper-V Computer Service 是否为 运行ning,这是任何 VM 启动所必需的,并且只能 运行如果机器上的其他一切都正确完成以启用 Hyper-V。

Get-Service vmcompute

Status   Name               DisplayName
------   ----               -----------
Running  vmcompute          Hyper-V Host Compute Service

我们曾经使用 MDT 任务序列部署服务器,并在此过程中启用 Hyper-V。它需要重新启动和特殊命令才能 运行 应用正确的 BIOS 设置。然后,我们可以启用 Windows 功能,但这些功能需要重新启动两次,因此处理大多数图像系统非常棘手。我们最后的 'Sanity Check' 是 Hyper-V 计算服务是否 运行ning。