如何在Windows系统中高效检测当前设备是否为虚拟机?
高效检测Windows虚拟机的几种实现方案
原脚本依赖systeminfo命令存在明显不足:一是仅检测Hyper-V,无法覆盖VMware、VirtualBox等主流虚拟机;二是systeminfo会遍历输出大量冗余系统信息,执行效率偏低。以下是几种更高效、覆盖更广的实现方案:
方案1:通过WMI读取硬件特征(兼容性强)
直接读取BIOS、主板、磁盘等核心硬件的标识信息,虚拟机的硬件通常带有特征字符串,执行速度远快于systeminfo。
import win32com.client def is_virtual_machine(): wmi = win32com.client.GetObject("winmgmts:") # 检查BIOS制造商特征 for bios in wmi.InstancesOf("Win32_BIOS"): manufacturer = bios.Manufacturer.lower() if any(vm_tag in manufacturer for vm_tag in ["vmware", "virtualbox", "microsoft", "qemu"]): return True # 检查主板制造商特征 for board in wmi.InstancesOf("Win32_BaseBoard"): manufacturer = board.Manufacturer.lower() if any(vm_tag in manufacturer for vm_tag in ["vmware", "virtualbox", "qemu"]): return True # 检查磁盘型号特征 for disk in wmi.InstancesOf("Win32_DiskDrive"): model = disk.Model.lower() if disk.Model else "" if any(vm_tag in model for vm_tag in ["vmware virtual", "virtualbox", "qemu"]): return True return False if is_virtual_machine(): print("当前是虚拟机") else: print("当前是物理主机")
方案2:调用Windows原生API(速度最快)
Windows 8.1及以上系统提供了IsVirtualMachine原生API,直接返回虚拟化状态,无需遍历任何系统信息,效率最高。旧系统可结合WMI检测作为补充。
import ctypes from ctypes import wintypes def check_hypervisor_native(): # 调用Windows原生API检测虚拟化 kernel32 = ctypes.WinDLL('kernel32', use_last_error=True) IsVirtualMachine = kernel32.IsVirtualMachine IsVirtualMachine.argtypes = [] IsVirtualMachine.restype = wintypes.BOOL return IsVirtualMachine() != 0 def is_virtual_machine(): # 优先用原生API,旧系统 fallback 到WMI try: if check_hypervisor_native(): return True except AttributeError: pass import win32com.client wmi = win32com.client.GetObject("winmgmts:") for bios in wmi.InstancesOf("Win32_BIOS"): if "vmware" in bios.Manufacturer.lower(): return True return False if is_virtual_machine(): print("当前是虚拟机") else: print("当前是物理主机")
方案3:读取注册表标识(轻量辅助检测)
主流虚拟机安装工具后会在注册表留下专属项,读取这些键值速度极快,可作为辅助检测手段(依赖虚拟机工具是否安装)。
import winreg def is_virtual_machine(): # 检测VMware Tools注册表项 try: key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, r"SOFTWARE\VMware, Inc.\VMware Tools") winreg.CloseKey(key) return True except FileNotFoundError: pass # 检测VirtualBox Guest Additions注册表项 try: key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, r"SOFTWARE\Oracle\VirtualBox Guest Additions") winreg.CloseKey(key) return True except FileNotFoundError: pass # 检测Hyper-V服务注册表项 try: key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, r"SYSTEM\CurrentControlSet\Services\hvboot") winreg.CloseKey(key) return True except FileNotFoundError: pass return False if is_virtual_machine(): print("当前是虚拟机") else: print("当前是物理主机")
内容的提问来源于stack exchange,提问作者woske the bot
相关产品推荐
相关产品推荐

