14

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

4

8 回答 8

17

您可以尝试使用以下 PowerShell 脚本,它利用 WMI 来确定机器是虚拟机还是物理机。


gwmi -q "select * from win32_computersystem"
当然,您也可以使用 C# 代码查询 WMI。上面脚本的输出将如下所示:

领域: ...
制造商:微软公司
型号:虚拟机
姓名 : .....
……
于 2013-03-18T20:18:59.800 回答
7

要从命令提示符检查这一点,您可以运行以下命令: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
于 2013-08-08T10:49:19.663 回答
6

据我所知,没有简单的方法可以做到这一点。

有一些解决方法,但至少据我所知,并不是一个万能的解决方案。

Ben Armstrong 写了一篇关于Detecting Microsoft virtual machines的帖子,其中有一个低级技巧可以确定您是在Virtual PC 还是 VMWare中运行,但仍然排除了 VirtualBox 等。

您可能想尝试的一个技巧是检测是否安装了 VMWare 工具或 VirtualBox 工具。在大多数情况下,它们安装在来宾操作系统上以提供所需的功能,但很难在您的终端上维护不同的安装 GUIDS,因此它不是一个理想的解决方案。

--- 另外,如果 VM 在 Linux KVM 环境中运行,输出是这样的 在此处输入图像描述

于 2013-03-18T20:02:48.687 回答
3

没有简单的方法来判断您是在裸机还是在虚拟计算机中运行,您可以做的最好的事情是获取一些硬件信息并做出有根据的猜测,例如,如果机器有网络适配器其中包含 Microsoft、VMware、Oracle、Hyper-V、Virtual 或 VirtualBox,考虑到 Microsoft、Oracle 或 VMware 都没有制造网卡,它很可能是一台虚拟机。

当您使用 C# 时,用于检索此和其他硬件信息的类是ManagementClass,还有一个不错的项目可以让您使用 ManagementClass 从计算机中检索大量信息。

于 2013-03-18T20:09:05.283 回答
1

运行systeminfo命令@命令提示符查看系统menufacturer n系统型号详情。在那里您可以找到虚拟机和物理机信息。

于 2013-04-02T18:08:01.783 回答
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”,未在其他工作站上测试。

于 2015-07-14T13:37:56.130 回答
0

您可以在 cmd 或 powershell 中使用此命令

系统信息

您会发现一行包含以下文本(或类似文本):

系统制造商:VMware, Inc. 系统型号:VMware Virtual Platform

于 2017-12-23T06:44:13.680 回答
-2

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

  1. 编写一个爬取您的网络(或 IP 范围)的应用程序以获取机器列表。
  2. 将这些机器显示给一个人,并要求他们检查一个框,如果它是一个虚拟机......
  3. 打印报告。
于 2013-03-18T20:17:35.190 回答