客户端JavaScript读取注册表检测.NET安装版本遇无法打开键报错问题
问题原因
- 无异常捕获机制:
WshShell.RegRead只要遇到目标注册表键不存在、路径错误、无访问权限的情况就会直接抛出运行时错误,你的代码未做异常捕获,任意一个键读取失败就会直接中断执行并返回报错。 - 64位系统注册表重定向:64位Windows中,CHM默认调用的32位
hh.exe进程访问HKLM\Software路径时,会被系统自动重定向到HKLM\Software\Wow6432Node节点,而.NET Framework的安装信息默认写入64位注册表路径,32位重定向路径下可能没有对应键值。 - 权限不足:普通用户权限下,系统默认禁止脚本访问
HKLM(本地计算机)层级的注册表项,会触发读取拦截。
解决方案
推荐优先使用无需读取注册表、权限要求更低的COM对象检测方案,兼容性更好:
var hasDotNet4 = false, hasDotNet35 = false; // 检测.NET 4.x try { // 4.x专属类,3.5及以下版本不存在 new ActiveXObject("System.Threading.Tasks.Task"); hasDotNet4 = true; } catch(e) {} // 检测.NET 3.5 if (!hasDotNet4) { try { // 3.5新增类,更低版本不存在 new ActiveXObject("System.Linq.Enumerable"); hasDotNet35 = true; } catch(e) {} } if (hasDotNet4) { alert('V4.x is installed'); } else if (hasDotNet35) { alert('V3.5 is installed'); } else { alert('No framework is installed'); }
如果需要坚持使用注册表检测方案,需要补充异常捕获、兼容32/64位双路径,代码如下:
var sh = new ActiveXObject("Wscript.shell"); var hasDotNet4 = false, hasDotNet35 = false; var regPaths = [ // 64位原生路径 "HKLM\\Software\\Microsoft\\NET Framework Setup\\NDP\\", // 32位重定向路径 "HKLM\\Software\\Wow6432Node\\Microsoft\\NET Framework Setup\\NDP\\" ]; // 遍历双路径检测 for (var i = 0; i < regPaths.length; i++) { try { if (sh.RegRead(regPaths[i] + "v4\\Full\\Install") == 1) { hasDotNet4 = true; } } catch(e) {} try { if (sh.RegRead(regPaths[i] + "v3.5\\Install") == 1) { hasDotNet35 = true; } } catch(e) {} } if (hasDotNet4) { alert('V4.x is installed'); } else if (hasDotNet35) { alert('V3.5 is installed'); } else { alert('No framework is installed'); }
注意:注册表检测方案需要CHM以管理员权限运行才能正常读取HKLM节点
内容的提问来源于stack exchange,提问作者jscriptjun
相关产品推荐
相关产品推荐

