我正在远程桌面连接我们实验室/数据中心的Windows服务器。我有一个要求,需要以编程方式找出所有服务器是虚拟机还是物理服务器,当然我们有环境表格告诉我们哪个是哪个。但我需要编写代码来区分它们。我需要使用什么技术?我没有找到一个 .Net 程序集可以做到这一点。寻求专家分享你的知识或指导,任何研究方向或链接,都将不胜感激!
我正在远程桌面连接我们实验室/数据中心的Windows服务器。我有一个要求,需要以编程方式找出所有服务器是虚拟机还是物理服务器,当然我们有环境表格告诉我们哪个是哪个。但我需要编写代码来区分它们。我需要使用什么技术?我没有找到一个 .Net 程序集可以做到这一点。寻求专家分享你的知识或指导,任何研究方向或链接,都将不胜感激!
You can try to use the following PowerShell script, it utilizes WMI to find out if machine is virtual machine or physical machine.
gwmi -q "select * from win32_computersystem"
Certainly, you can use C# code to query WMI too. The output of script above will be like following:
领域:...
制造商:微软公司
型号:虚拟机
名称:......
....要从命令提示符中检查此内容,您可以运行以下命令: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
很难判断你运行在裸机还是虚拟机中,最好的方法是获取一些硬件信息并进行推测。例如,如果机器有一个包含Microsoft、VMware、Oracle、Hyper-V、Virtual或VirtualBox的网络适配器,很可能它是一个虚拟机,因为Microsoft、Oracle或VMware都不生产网络卡。
由于您使用C#,检索此和其他硬件信息的类是ManagementClass,此外还有这个不错的project可让您使用ManagementClass从计算机中检索大量信息。
这在PowerShell中非常有效:
$ecv = (get-wmiobject win32_BIOS).EmbeddedControllerMajorVersion
$isPhysical = $ecv -gt 0 -and $ecv -lt 255
虚拟机没有控制器,或者版本号为'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
你可以在命令提示符或PowerShell中使用此命令
SYSTEMINFO
您将找到一行包含以下文本(或类似文本):
系统制造商:VMware,Inc. 系统型号:VMware虚拟平台
我所知道的唯一可靠的编程方法是: