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

C# 如何检查我的windows服务器是虚拟机还是物理机,c#,virtual-machine,windows-server,C#,Virtual Machine,Windows Server,我正在将桌面远程连接到实验室/数据中心的windows服务器。我有一个要求,以编程方式确定我们所有的服务器都是虚拟机或物理服务器,当然我们有环境表告诉我们哪个是哪个。但我需要编写代码来区分它。我需要使用什么技巧?我没有找到一个.Net程序集来执行此操作。寻找专家分享您的知识或指导,任何研究方向或链接,将不胜感激 据我所知,没有简单的方法可以做到这一点 有一些变通办法,但至少据我所知,并不是一刀切的解决方案 本·阿姆斯特朗(Ben Armstrong)写了一篇关于的帖子,其中有一个低级技巧可以确定

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

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

有一些变通办法,但至少据我所知,并不是一刀切的解决方案

本·阿姆斯特朗(Ben Armstrong)写了一篇关于的帖子,其中有一个低级技巧可以确定您是否在一个范围内运行,但这仍然忽略了VirtualBox和其他人

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

--另外,如果VM在Linux KVM环境中运行,则输出如下

要判断您是在裸机上运行还是在虚拟计算机上运行,没有简单的方法,最好的办法是获取一些硬件信息并做出有根据的猜测,例如,如果机器有一个包含Microsoft、VMware、Oracle、Hyper-V、virtual或VirtualBox的网络适配器,考虑到微软、甲骨文或VMware都不制造网卡,这很可能是一台虚拟机

当您使用C时,用于检索此硬件信息和其他硬件信息的类是,还有一个很好的类,它允许您使用ManagementClass从计算机检索大量信息。

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

编写一个应用程序,对您的网络或IP范围进行爬网,以获取计算机列表。 向一个人显示这些机器,并要求他们选中一个框,如果它是虚拟机。。。 打印报告。
您可以尝试使用以下PowerShell脚本,它利用WMI来确定机器是虚拟机还是物理机。

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

Domain: ... Manufacturer: Microsoft Corporation Model: Virtual Machine Name : ..... ....
运行systeminfo命令@命令提示符查看系统菜单制造商n系统型号详细信息。您可以在那里找到虚拟机和物理机信息。

要从命令提示符检查此信息,您可以运行以下命令: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
物理服务器的输出示例:

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
试试这个:

FOR /F "tokens=*" %a IN ('wmic bios get bioscharacteristics^|find /c "33"') DO set USBlegacy=%a
对于我的环境中范围有限的台式机和笔记本电脑,返回1;对于VMWare workstation 9、ESX 5.5以及Citrix 6.5和7.6,返回0。我只在这四个虚拟环境中找到了一个为系统供应商保留的虚拟环境,这样做的效果正好相反

编辑:或者是这样的:

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

在HP桌面上返回5,在VMware workstation 9和ESX 5.5上返回0,在其他桌面上未测试。

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

系统信息

您将发现一行包含以下文字或类似文字:

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

感谢您的回复,我们将对此进行调查。感谢您的回复。将检查链接。在笔记本上的物理windows 10上返回0这是ACPI风扇的“0”吗?如果笔记本电脑没有风扇,这是有意义的。我的Windows 10中的Dell Precision m3800笔记本电脑为ACPI风扇返回“2”,为USBlegacyYep返回“1”。ACPI风扇=0