我正在将桌面远程连接到我们实验室/数据中心的 Windows 服务器。我需要以编程方式确定我们所有的服务器是虚拟机还是物理服务器,当然我们有环境表告诉我们哪个是哪个。但是我需要编写代码来区分它。我需要使用什么技术?我没有找到一个 .Net 程序集来做到这一点。寻找专家分享您的知识或指导,任何研究方向或链接,任何东西都将不胜感激!
8 回答
您可以尝试使用以下 PowerShell 脚本,它利用 WMI 来确定机器是虚拟机还是物理机。
gwmi -q "select * from win32_computersystem"
当然,您也可以使用 C# 代码查询 WMI。上面脚本的输出将如下所示:
领域: ... 制造商:微软公司 型号:虚拟机 姓名 : ..... ……
要从命令提示符检查这一点,您可以运行以下命令: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
据我所知,没有简单的方法可以做到这一点。
有一些解决方法,但至少据我所知,并不是一个万能的解决方案。
Ben Armstrong 写了一篇关于Detecting Microsoft virtual machines的帖子,其中有一个低级技巧可以确定您是在Virtual PC 还是 VMWare中运行,但仍然排除了 VirtualBox 等。
您可能想尝试的一个技巧是检测是否安装了 VMWare 工具或 VirtualBox 工具。在大多数情况下,它们安装在来宾操作系统上以提供所需的功能,但很难在您的终端上维护不同的安装 GUIDS,因此它不是一个理想的解决方案。
--- 另外,如果 VM 在 Linux KVM 环境中运行,输出是这样的
没有简单的方法来判断您是在裸机还是在虚拟计算机中运行,您可以做的最好的事情是获取一些硬件信息并做出有根据的猜测,例如,如果机器有网络适配器其中包含 Microsoft、VMware、Oracle、Hyper-V、Virtual 或 VirtualBox,考虑到 Microsoft、Oracle 或 VMware 都没有制造网卡,它很可能是一台虚拟机。
当您使用 C# 时,用于检索此和其他硬件信息的类是ManagementClass,还有一个不错的项目可以让您使用 ManagementClass 从计算机中检索大量信息。
运行systeminfo命令@命令提示符查看系统menufacturer n系统型号详情。在那里您可以找到虚拟机和物理机信息。
尝试这个:
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”,未在其他工作站上测试。
您可以在 cmd 或 powershell 中使用此命令
系统信息
您会发现一行包含以下文本(或类似文本):
系统制造商:VMware, Inc. 系统型号:VMware Virtual Platform
我知道的唯一可靠的*编程*方法是:
- 编写一个爬取您的网络(或 IP 范围)的应用程序以获取机器列表。
- 将这些机器显示给一个人,并要求他们检查一个框,如果它是一个虚拟机......
- 打印报告。