我正在将桌面远程连接到我们的实验室/数据中心的Windows服务器。我要求以编程方式弄清楚我们所有的服务器都是虚拟机或物理服务器,当然我们有环境表告诉我们哪个是哪个。但我需要编写代码来区分它。我需要使用什么技术?我没有找到.Net程序集来做到这一点。寻找专家分享您的知识或指导,任何研究方向或链接,任何事情都将不胜感激!
答案 0 :(得分:16)
您可以尝试使用以下PowerShell脚本,它利用WMI查明计算机是虚拟机还是物理计算机。
gwmi -q "select * from win32_computersystem"
当然,您也可以使用C#代码来查询WMI。上面脚本的输出如下:
Domain: ... Manufacturer: Microsoft Corporation Model: Virtual Machine Name : ..... ....
答案 1 :(得分: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
答案 2 :(得分:6)
据我所知,没有 easy 方法可以做到这一点。
有一些解决方法,但至少据我所知,并非一个通用的解决方案。
本阿姆斯特朗撰写了一篇关于Detecting Microsoft virtual machines的文章,并且有一个低级别的技巧可以决定你是否在Virtual PC or VMWare内运行,但仍然遗漏了VirtualBox和其他人。
您可能想要尝试的一个技巧是检测是否安装了VMWare Tools或VirtualBox Tools。在大多数情况下,它们安装在客户操作系统上以提供所需的功能,但很难维护不同的安装GUID,因此它不是一个理想的解决方案。
---另外,如果VM在Linux KVM环境中运行,则输出就像这样
答案 3 :(得分:3)
没有简单的方法可以判断您是在裸机还是在虚拟计算机上运行,您可以做的最好的事情是获取一些硬件信息并做出有根据的猜测,例如,如果机器有一个包含Microsoft,VMware,Oracle,Hyper-V,Virtual或VirtualBox的网络适配器,很可能它是一台虚拟机,因为Microsoft,Oracle或VMware都没有制造网卡。
当您使用C#时,用于检索此信息和其他硬件信息的类是ManagementClass,还有一个很好的project,可让您使用ManagementClass从计算机中检索大量信息。
答案 4 :(得分:1)
运行systeminfo命令@命令提示符,查看系统制造商和系统型号详细信息。在那里,您可以找到虚拟和物理机器信息。
答案 5 :(得分:0)
试试这个:
FOR /F "tokens=*" %a IN ('wmic bios get bioscharacteristics^|find /c "33"') DO set USBlegacy=%a
这将返回" 1"对于我环境中的桌面和笔记本电脑的有限范围和" 0"适用于VMWare工作站9,ESX 5.5和Citrix 6.5和7.6。 BIOSCharacteristic" 50" (一个"保留给系统供应商")我只在四个虚拟环境中找到,以便反向工作。
编辑:或者有:
FOR /F "tokens=*" %a IN ('wmic path win32_pnpentity get ^|find /c "ACPI Fan"') DO set ACPIfan=%a
返回" 5"在HP桌面上," 0"在VMware工作站9和ESX 5.5上,未在其他工作站上进行测试。
答案 6 :(得分:0)
您可以在cmd或powershell中使用此命令
SYSTEMINFO
您将找到包含以下文字(或类似)的行:
系统制造商:VMware,Inc。 系统模型:VMware Virtual Platform
答案 7 :(得分:-2)
仅 * programmatic *我知道这样做可靠的方式是: