如何检查我的Windows服务器是虚拟机还是物理机

16

我正在远程桌面连接我们实验室/数据中心的Windows服务器。我有一个要求,需要以编程方式找出所有服务器是虚拟机还是物理服务器,当然我们有环境表格告诉我们哪个是哪个。但我需要编写代码来区分它们。我需要使用什么技术?我没有找到一个 .Net 程序集可以做到这一点。寻求专家分享你的知识或指导,任何研究方向或链接,都将不胜感激!

9个回答

19

You can try to use the following PowerShell script, it utilizes WMI to find out if machine is virtual machine or physical machine.


gwmi -q "select * from win32_computersystem"
Certainly, you can use C# code to query WMI too. The output of script above will be like following:

领域:... 制造商:微软公司 型号:虚拟机 名称:...... ....

8

要从命令提示符中检查此内容,您可以运行以下命令:systeminfo | find "System"

虚拟服务器的示例输出:

System Manufacturer:       Microsoft Corporation    
System Model:              Virtual Machine    
System Type:               x64-based PC

物理服务器的示例输出:

System Manufacturer:       HP
System Model:              ProLiant BL460c G6
System Type:               x64-based PC

我收到了“FIND: 参数格式不正确”的错误信息。你的命令行示例需要做一些修改吗?我正在使用PowerShell 5.1版本。 - undefined

6
据我所知,没有简单的方法可以做到这一点。有一些变通方法,但至少据我所知,并没有一种通用的解决方案。Ben Armstrong在Detecting Microsoft virtual machines中写了一篇文章,其中提到了一个低级技巧,可以确定您是否在Virtual PC或VMWare中运行,但这仍然排除了VirtualBox和其他虚拟机。您可能想尝试的一个技巧是检测VMWare Tools或VirtualBox Tools是否已安装。在大多数情况下,它们会被安装在客户操作系统上以提供所需的功能,但是在您的端上维护不同的安装GUIDS将是困难的,因此这不是一个理想的解决方案。--- 另外,如果虚拟机正在Linux KVM环境中运行,则输出如下图所示: enter image description here

3

很难判断你运行在裸机还是虚拟机中,最好的方法是获取一些硬件信息并进行推测。例如,如果机器有一个包含Microsoft、VMware、Oracle、Hyper-V、Virtual或VirtualBox的网络适配器,很可能它是一个虚拟机,因为Microsoft、Oracle或VMware都不生产网络卡。

由于您使用C#,检索此和其他硬件信息的类是ManagementClass,此外还有这个不错的project可让您使用ManagementClass从计算机中检索大量信息。


1
运行systeminfo命令@命令提示符查看系统制造商和系统型号详细信息。您可以在那里找到虚拟和物理机器信息。

0

这在PowerShell中非常有效:

$ecv = (get-wmiobject win32_BIOS).EmbeddedControllerMajorVersion
$isPhysical = $ecv -gt 0 -and $ecv -lt 255

虚拟机没有控制器,或者版本号为'0'。


在VMware中,Windows的值为255。 - bin456789
感谢您的反馈。我已经更新了脚本,以覆盖那个VMware虚拟值。 - Carsten

0

试试这个:

FOR /F "tokens=*" %a IN ('wmic bios get bioscharacteristics^|find /c "33"') DO set USBlegacy=%a

这将在我的环境中适用于有限范围的台式机和笔记本电脑,返回“1”,而对于VMWare工作站9、ESX 5.5和Citrix 6.5和7.6,则返回“0”。BIOSCharacteristic“50”(一个“保留给系统供应商”的特征),我只在四个虚拟环境中发现过,因此可以反向使用。

编辑:或者还有这个:

FOR /F "tokens=*" %a IN ('wmic path win32_pnpentity get ^|find /c "ACPI Fan"') DO set ACPIfan=%a

在HP桌面上返回“5”,在VMware工作站9和ESX 5.5上返回“0”,其他设备未经测试。

在笔记本上的物理 Windows 10 上返回0。 - Daniel Fisher lennybacon
这是“ACPI风扇”的‘0’吗?如果笔记本没有风扇,这是有道理的。我的戴尔Precision m3800笔记本在Windows 10中返回“ACPI风扇”的‘2’(并返回“USBlegacy”的‘1’)。 - AndyKn
是的。ACPI风扇=0。 - Daniel Fisher lennybacon

0

你可以在命令提示符或PowerShell中使用此命令

SYSTEMINFO

您将找到一行包含以下文本(或类似文本):

系统制造商:VMware,Inc. 系统型号:VMware虚拟平台


-2

我所知道的唯一可靠的编程方法是:

  1. 编写一个应用程序来爬取您的网络(或IP范围)以获取机器列表。
  2. 向用户显示这些机器,并要求他们勾选一个框,以确定它是否为虚拟机...
  3. 打印报告。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接