Electron运行环境判断(是否在虚拟机中)

前言

为了防止用户在虚拟机中运行软件,我们需要为当前运行环境做判断,为虚拟机的话我们退出程序就可以了。

原理:使用命令获取计算机的硬件信息,进行关键字匹配

shell 复制代码
# win
powershell "Get-WmiObject -Class Win32_ComputerSystem | Select-Object Manufacturer, Model"
base 复制代码
# Mac
system_profiler SPHardwareDataType

正文

在主流虚拟机中的情况

  1. Hyper-V

关键字Virtual Machine

  1. VMware

Windows系统,关键字VMware

Mac系统,关键字Virtual MachineVMware

  1. QEMU

关键字QEMU

代码

js 复制代码
/* 虚拟机特征 */
const vmSignatures = [
  //虚拟机软件
  'VMware',
  //桌面虚拟化软件
  'VirtualBox',
  //开源的桌面虚拟化软件
  'VBox',
  //开源的硬件模拟器和虚拟化器
  'QEMU',
  //开源的虚拟机管理器(或称 hypervisor)
  'Xen',
  //微软开发的硬件虚拟化产品
  'Hyper-V',
  //虚拟化软件
  'Parallels',
  // 关键字
  'Virtual Machine',
];

/* 是否是虚拟机 */
export const isVirtualMachine = async () => {
  if (process.platform == 'win32') {
    return detectWindowsVM(); // 在Windows系统上检测虚拟机
  }
  if (process.platform == 'darwin') {
    return detectMacOSVM(); // 在Mac系统上检测虚拟机
  }
  return false;
};

/* Windows 虚拟机检测 */
const detectWindowsVM = async (): Promise<boolean> => {
  try {
    const { exec } = require('child_process');
    const util = require('util');
    const execAsync = util.promisify(exec);

    // 使用PowerShell Get-WmiObject检查系统制造商
    try {
      const { stdout: systemInfo } = await execAsync(
        'powershell "Get-WmiObject -Class Win32_ComputerSystem | Select-Object Manufacturer, Model"',
      );

      log.info('systemInfo:', systemInfo.toLowerCase());
      for (const signature of vmSignatures) {
        if (systemInfo.toLowerCase().includes(signature.toLowerCase())) {
          log.info('VM detected by Get-WmiObject:', systemInfo);
          return true;
        }
      }
    } catch (error) {
      log.debug('Get-WmiObject check failed:', error);
    }

    return false;
  } catch (error) {
    log.error('Windows VM detection error:', error);
    return false;
  }
};

/* macOS 虚拟机检测 */
const detectMacOSVM = async (): Promise<boolean> => {
  try {
    const { exec } = require('child_process');
    const util = require('util');
    const execAsync = util.promisify(exec);

    // 检查系统硬件信息
    try {
      const { stdout: sysInfo } = await execAsync(
        'system_profiler SPHardwareDataType',
      );

      log.info('macOS system info:', sysInfo.toLowerCase());
      for (const signature of vmSignatures) {
        if (sysInfo.toLowerCase().includes(signature.toLowerCase())) {
          log.info('VM detected by system info:', signature);
          return true;
        }
      }
    } catch (error) {
      log.debug('System info check failed:', error);
    }

    return false;
  } catch (error) {
    log.error('macOS VM detection error:', error);
    return false;
  }
};

结语

感谢阅读

相关推荐
虹科网络安全8 分钟前
艾体宝新闻|从 SQL 注入到服务器接管:CVE-2026-57517 暴露 Web 管理面板的供应链与安全编码风险
服务器·前端·sql
糖果店的幽灵14 分钟前
langgraph的四种state解析
java·前端·javascript·langgraph
顺颂时绥_128 分钟前
前端大图片压缩与安卓/苹果设备矫正实践
前端
Csvn30 分钟前
JSON.parse 大数精度丢失:一个让前后端互相甩锅的 Bug
前端
张元清36 分钟前
React useCookie Hook:把 Cookie 变成响应式状态(2026)
javascript·react.js
Helen_cai1 小时前
OpenHarmony 项目统一全局样式、尺寸、色彩主题封装 ThemeUtil(API23)
开发语言·前端·javascript·华为·harmonyos
郑州光合科技余经理1 小时前
家政O2O平台解析:从0搭建上门预约小程序解决方案
android·java·开发语言·前端·小程序·架构·php
小徐_23331 小时前
AI 写 wot-ui 总在猜 API?我们把 Skills、MCP 和 CLI 都配好了
前端·uni-app·ai编程
winfredzhang1 小时前
用 wxPython + ECharts + 阿里矢量地图,做一个可离线兜底的上海雨量看板
前端·javascript·echarts
索西引擎1 小时前
【React】Immer.js 在现代 Redux 生态中的角色:不可变性保障的工程化实现与开发体验优化
前端·javascript·react.js