electorn 获取windows 电脑的cpu 和 硬盘信息 计算id

main.js

const { app, BrowserWindow } = require('electron');
const { getDeviceId } = require('./hardwareId');

let mainWindow;

function createWindow() {
  mainWindow = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      nodeIntegration: true, // 注意:在生产环境中不推荐启用nodeIntegration
      contextIsolation: false
    }
  });

  mainWindow.loadFile('index.html');

  // 获取设备ID并发送到渲染进程
  getDeviceId().then(deviceId => {
    console.log('设备唯一ID:', deviceId);
    // 当窗口加载完成后发送设备ID
    mainWindow.webContents.on('did-finish-load', () => {
      mainWindow.webContents.send('device-id', deviceId);
    });
  }).catch(error => {
    console.error('获取设备ID时出错:', error);
  });

  mainWindow.on('closed', () => {
    mainWindow = null;
  });
}

app.on('ready', createWindow);

app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') {
    app.quit();
  }
});

app.on('activate', () => {
  if (mainWindow === null) {
    createWindow();
  }
});

hardwareId.js

const { exec } = require('child_process');
const crypto = require('crypto');
const util = require('util');

// 转换exec为Promise形式,便于异步处理
const execAsync = util.promisify(exec);

/**
 * 获取CPU信息
 * @returns {Promise<string>} CPU标识符
 */
async function getCpuInfo() {
  try {
    // 使用wmic命令获取CPU序列号
    const { stdout } = await execAsync('wmic cpu get processorid');
    // 提取并清理CPU序列号
    const cpuId = stdout.split('\n')[1]?.trim() || '';
    return cpuId;
  } catch (error) {
    console.error('获取CPU信息失败:', error);
    return '';
  }
}

/**
 * 获取硬盘信息
 * @returns {Promise<string>} 硬盘标识符
 */
async function getDiskInfo() {
  try {
    // 使用wmic命令获取硬盘序列号(取第一个硬盘)
    const { stdout } = await execAsync('wmic diskdrive get serialnumber');
    // 提取并清理硬盘序列号
    const diskId = stdout.split('\n')[1]?.trim() || '';
    return diskId;
  } catch (error) {
    console.error('获取硬盘信息失败:', error);
    return '';
  }
}

/**
 * 计算设备唯一ID
 * @returns {Promise<string>} 设备唯一ID
 */
async function getDeviceId() {
  try {
    // 获取CPU和硬盘信息
    const [cpuId, diskId] = await Promise.all([getCpuInfo(), getDiskInfo()]);
    
    // 如果获取硬件信息失败,使用备选方案
    if (!cpuId && !diskId) {
      console.warn('无法获取硬件信息,使用系统信息作为备选');
      const { stdout } = await execAsync('wmic csproduct get uuid');
      const systemId = stdout.split('\n')[1]?.trim() || '';
      if (!systemId) {
        throw new Error('无法获取任何硬件标识信息');
      }
      return generateHash(systemId);
    }
    
    // 组合硬件信息生成唯一字符串
    const hardwareInfo = `${cpuId}|${diskId}`;
    // 生成哈希值作为设备ID
    return generateHash(hardwareInfo);
  } catch (error) {
    console.error('计算设备ID失败:', error);
    throw error;
  }
}

/**
 * 生成哈希值
 * @param {string} data 要哈希的数据
 * @returns {string} 哈希结果
 */
function generateHash(data) {
  // 使用SHA-256算法生成哈希
  const hash = crypto.createHash('sha256');
  hash.update(data);
  // 返回十六进制格式的哈希值
  return hash.digest('hex');
}

// 导出模块
module.exports = {
  getDeviceId,
  getCpuInfo,
  getDiskInfo
};

使用说明:

  1. 上述代码通过 Windows 的 WMIC 命令获取硬件信息:

    • CPU 信息:使用wmic cpu get processorid获取 CPU 序列号
    • 硬盘信息:使用wmic diskdrive get serialnumber获取硬盘序列号
    • 备选方案:如果上述信息无法获取,使用wmic csproduct get uuid获取系统 UUID
  2. 计算设备 ID 的过程:

    • 组合获取到的硬件信息
    • 使用 SHA-256 算法对组合信息进行哈希计算
    • 生成的哈希值作为设备唯一 ID
  3. 在 Electron 中使用:

    • 主进程中调用getDeviceId()方法获取设备 ID
    • 通过 IPC 通信将设备 ID 发送到渲染进程
    • 可以将此 ID 用于注册码生成和验证

注意事项:

  • 某些情况下(如虚拟机、某些硬件配置)可能无法获取到完整的硬件信息
  • 管理员权限可能会提高硬件信息获取的成功率
  • 在生产环境中,建议关闭nodeIntegration并使用上下文隔离,通过预加载脚本进行安全的 IPC 通信
  • 硬件信息可能会在更换硬件时发生变化,这会导致设备 ID 改变

这个方案完全在本地完成,不需要后台服务器支持,适合用于生成基于设备的注册码系统。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三希

如果这篇文章帮您解决了技术难题

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值