Electron开发如何获取Windows系统基础硬件信息
Windows平台Electron硬件信息采集实现方案
你用systeminformation拿到的结果不符合预期,90%是踩了Electron进程权限、原生模块编译的坑,下面给两种可直接落地的实现方式:
方案1:正确配置使用systeminformation(开发效率最高)
多数人用这个库拿不到正确数据,都是这几个原因:
- 直接在沙箱化的渲染进程调用库方法,没有系统调用权限
- 安装依赖后没有针对当前Electron版本重编译原生模块,ABI不匹配导致调用异常
- 打包时误将库依赖剔除,运行时加载空模块
落地步骤:
- 安装依赖并完成原生模块重编译,直接在项目根目录执行以下命令:
npm install systeminformation --savenpm install @electron/rebuild --save-devnpx electron-rebuild -f -w systeminformation - 所有硬件查询逻辑全部放在主进程编写,通过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,提问作者金红日
相关产品推荐
相关产品推荐

