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

NodeJS exec调用PowerShell无法读取注册表MachineGuid求助

问题原因分析与解决方案

问题根源

这是Windows注册表32位/64位重定向导致的:

  • 若你运行的是32位版本的Node.js,Windows会自动将32位进程对HKLM:\Software的访问重定向到HKLM:\Software\Wow6432Node分支。
  • MachineGuid实际存储在64位注册表的HKLM:\Software\Microsoft\Cryptography路径下,32位Node进程访问原路径时,实际读取的是Wow6432Node下的同名键(该分支通常没有MachineGuid值),因此会提示属性不存在或返回空。
  • 直接在PowerShell中执行命令正常,是因为你打开的PowerShell是64位版本(和系统位数匹配),不会触发重定向。

可行解决方案

方案1:强制调用64位PowerShell

针对32位Node.js运行在64位系统的场景,指定64位PowerShell的绝对路径:

const { execSync } = require('child_process');
const command = "Get-ItemPropertyValue -Path 'HKLM:\\Software\\Microsoft\\Cryptography' -Name MachineGuid";
// 64位系统下,通过Sysnative绕过32位重定向访问真正的System32目录
const options = { 
  shell: 'C:\\Windows\\Sysnative\\WindowsPowerShell\\v1.0\\powershell.exe' 
};
const id = execSync(command, options).toString().trim();
console.log(id);

说明:Sysnative是Windows为32位进程提供的虚拟目录,用来访问64位系统文件,仅在64位系统上存在。

方案2:在PowerShell命令中指定64位注册表视图

PowerShell 5.1及以上版本支持-RegistryView参数,直接指定读取64位注册表分支:

const { execSync } = require('child_process');
const command = "Get-ItemPropertyValue -Path 'HKLM:\\Software\\Microsoft\\Cryptography' -Name MachineGuid -RegistryView 64Bit";
const options = { shell: 'powershell.exe' };
const id = execSync(command, options).toString().trim();
console.log(id);

方案3:切换为64位Node.js

直接安装并使用64位版本的Node.js,此时Node进程为64位,不会触发注册表重定向,你的原代码可以直接正常运行。

内容的提问来源于stack exchange,提问作者Daniel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 00:32:01