如何检查我的Windows服务器是虚拟机还是物理机
我正在将桌面远程连接到我们的实验室/数据中心的Windows服务器。 我需要以编程方式弄清楚我们所有的服务器都是虚拟机或物理服务器,当然我们有环境表告诉我们哪个是哪个。 但我需要编写代码来区分它。 我需要使用什么技术? 我没有找到.Net程序集来做到这一点。 寻找专家分享您的知识或指导,任何研究方向或链接,任何事情将不胜感激!
您可以尝试使用以下PowerShell脚本,它利用WMI来确定计算机是虚拟机还是物理计算机。
gwmi -q "select * from win32_computersystem"
当然,您也可以使用C#代码来查询WMI。 上面脚本的输出如下:
领域:...... 制造商:Microsoft Corporation 型号:虚拟机 名称 : ..... ....
要从命令提示符检查这一点,您可以运行: systeminfo | find "System"
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
据我所知,没有简单的方法可以做到这一点。
有一些解决方法,但至少据我所知,并非一个通用的解决方案。
本阿姆斯特朗撰写了一篇关于检测微软虚拟机的post,并且有一个低级别的技巧可以决定你是在虚拟PC还是VMWare中运行,但仍然没有使用VirtualBox等。
您可能想要尝试的一个技巧是检测是否安装了VMWare Tools或VirtualBox Tools。 在大多数情况下,它们安装在客户操作系统上以提供所需的function,但是很难在您的端部维护不同的安装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范围)的应用程序以获取计算机列表。
- 向一个人显示这些机器并要求他们检查一个盒子,如果它是一个VM …
- 打印报告。