VBScript无法读取HKCR\CLSID下部分子键,是否与32/64位注册表差异有关?
问题原因与解决方案
1. WOW64注册表重定向机制是真实存在的
64位Windows系统为了兼容32位程序,设计了注册表重定向机制:
- 32位程序默认访问32位注册表分支,所有访问
HKEY_LOCAL_MACHINE\SOFTWARE的请求都会被自动重定向到HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node - 64位程序默认访问原生64位注册表分支,无重定向
HKCR同样存在该差异:HKCR是HKLM\Software\Classes和HKCU\Software\Classes的合并视图,32位程序访问HKCR时会自动重定向到HKLM\SOFTWARE\WOW6432Node\Classes,因此无法读取到64位程序注册的CLSID条目,你列出的无法识别的CLSID均为64位应用(包括64位OneDrive)在64位注册表分支注册的内容。
2. 区分32/64位注册表条目的方法
- 64位原生CLSID存储路径:
HKLM\SOFTWARE\Classes\CLSID\ - 32位兼容CLSID存储路径:
HKLM\SOFTWARE\WOW6432Node\Classes\CLSID\
你用系统默认的64位注册表编辑器(regedit.exe)查看条目时,如果该条目同时存在于两个路径下,即为32位程序注册的兼容条目,仅存在于原生路径下即为64位条目。
3. 解决VBScript无法读取的方案
方案1:强制使用64位脚本宿主运行
64位Windows系统内置两个版本的VBScript运行环境:
- 32位宿主:
C:\Windows\SysWOW64\wscript.exe/cscript.exe - 64位宿主:
C:\Windows\System32\wscript.exe/cscript.exe
直接调用64位宿主运行你的脚本,即可直接读取到64位注册表下的所有CLSID条目。
方案2:32位脚本中指定访问64位注册表
如果你必须在32位环境下运行脚本,可以修改StdRegProv的初始化参数,强制指定访问64位注册表分支,将代码中创建oReg的行替换为:
dim oReg: set oReg = GetObject("winmgmts:{impersonationLevel=impersonate,Architecture=64}!\\.\root\default:StdRegProv")
4. 你现有代码的其他错误
你当前的代码还有两处明显错误,也会导致运行失败:
- 正则表达式写法错误:
{在正则中是特殊字符需要转义,你要匹配前缀的规则应该写为re.Pattern = "^\{04271989-C4D2-.+",原写法既没有转义{,*的用法也不符合正则语法,无法正确匹配目标CLSID。 - 读取值的方法错误:
System.IsPinnedToNameSpaceTree是DWORD类型,你使用的GetExpandedStringValue是读取可扩展字符串的方法,应该替换为GetDWORDValue才能正确获取数值。
5. 其他可能的原因
如果修改后仍然无法读取,可排查权限问题:HKCR下的系统级CLSID修改需要管理员权限,普通用户仅拥有只读权限,运行脚本时需要右键选择「以管理员身份运行」才能执行写入操作。
内容的提问来源于stack exchange,提问作者JamesA
相关产品推荐
相关产品推荐

