You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Electron开发如何获取Windows系统基础硬件信息

Windows平台Electron硬件信息采集实现方案

你用systeminformation拿到的结果不符合预期,90%是踩了Electron进程权限、原生模块编译的坑,下面给两种可直接落地的实现方式:

方案1:正确配置使用systeminformation(开发效率最高)

多数人用这个库拿不到正确数据,都是这几个原因:

  • 直接在沙箱化的渲染进程调用库方法,没有系统调用权限
  • 安装依赖后没有针对当前Electron版本重编译原生模块,ABI不匹配导致调用异常
  • 打包时误将库依赖剔除,运行时加载空模块

落地步骤:

  1. 安装依赖并完成原生模块重编译,直接在项目根目录执行以下命令:
    npm install systeminformation --save
    npm install @electron/rebuild --save-dev
    npx electron-rebuild -f -w systeminformation
  2. 所有硬件查询逻辑全部放在主进程编写,通过preload桥接给渲染进程调用,不要直接在渲染进程引库。
    核心代码示例:
    主进程(main.js):
const si = require('systeminformation');
const { ipcMain } = require('electron');

ipcMain.handle('query-hardware-info', async () => {
  // 并行查询所有需要的硬件信息,减少等待时间
  const [bios, cpu, mem, diskLayout, networkList] = await Promise.all([
    si.bios(),
    si.cpu(),
    si.mem(),
    si.diskLayout(),
    si.networkInterfaces()
  ]);

  // 按需求裁剪字段,避免把冗余数据传给渲染进程
  return {
    bios: {
      vendor: bios.vendor,
      version: bios.version,
      releaseDate: bios.releaseDate
    },
    cpu: {
      manufacturer: cpu.manufacturer,
      model: cpu.brand,
      physicalCores: cpu.physicalCores,
      logicalCores: cpu.cores,
      baseSpeed: cpu.speed
    },
    memory: {
      totalBytes: mem.total,
      usedBytes: mem.used,
      freeBytes: mem.free
    },
    storage: diskLayout.map(disk => ({
      device: disk.device,
      type: disk.type,
      name: disk.name,
      totalBytes: disk.size,
      vendor: disk.vendor
    })),
    network: networkList.filter(net => !net.internal).map(net => ({
      name: net.ifaceName,
      ipv4: net.ip4,
      mac: net.mac,
      speedMbps: net.speed
    }))
  }
})

preload脚本(preload.js,需要在BrowserWindow初始化时配置加载):

const { contextBridge, ipcRenderer } = require('electron');
contextBridge.exposeInMainWorld('systemAPI', {
  getHardwareInfo: () => ipcRenderer.invoke('query-hardware-info')
})

渲染进程调用:

const hardwareData = await window.systemAPI.getHardwareInfo();
console.log(hardwareData);

注意:打包时将systeminformation加入打包依赖的白名单,避免被构建工具标记为外部依赖剔除;如果打包后运行拿不到BIOS数据,检查是否被安全软件拦截了WMI调用。

方案2:无第三方依赖原生实现(可控性最高)

如果不想引入第三方依赖,直接在主进程调用Windows系统自带的WMI接口查询即可,不存在第三方库封装错误、版本兼容问题。
核心实现是通过Node.js的child_process执行系统查询命令,解析返回结果即可:

const { execSync } = require('child_process');

/**
 * 执行WMI查询并解析结构化结果
 * @param {string} wmiClass WMI类名,比如bios、cpu、diskdrive
 */
function getWMIData(wmiClass) {
  const rawOutput = execSync(`wmic ${wmiClass} list /format:csv`, {
    encoding: 'utf8',
    windowsHide: true
  });
  const lines = rawOutput.trim().split('\n').filter(line => line.trim());
  const headers = lines[0].split(',').map(h => h.trim());
  return lines.slice(1).map(line => {
    const values = line.split(',');
    const record = {};
    headers.forEach((key, idx) => {
      record[key] = values[idx]?.trim() || '';
    });
    return record;
  });
}

// 按需调用即可拿到对应数据
const biosData = getWMIData('bios')[0]; // 包含厂商、版本、发布日期字段
const cpuData = getWMIData('cpu');
const memoryBankData = getWMIData('memorychip'); // 每条内存条的参数,累加可得总内存
const diskData = getWMIData('diskdrive');
const networkData = getWMIData('nicconfig').filter(item => item.IPEnabled === 'TRUE');

如果遇到Windows 11精简版系统默认移除wmic的情况,把命令替换为PowerShell的Get-CimInstance调用即可,查询逻辑完全一致。

通用注意事项

  • 所有系统级调用必须放在主进程执行,渲染进程默认开启沙箱,没有权限调用系统接口、执行子进程
  • 上述所有硬件信息的读取不需要管理员权限,不要额外配置requestedExecutionLevel为requireAdministrator,否则会触发UAC弹窗影响使用体验
  • 查询硬件信息的逻辑不要放在应用启动时同步执行,建议放在页面加载完成后异步调用,避免拖慢应用启动速度

内容的提问来源于stack exchange,提问作者金红日

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 07:39:20