Vbscript 无法读取某些子键?

Some SubKeys can't be read with Vbscript?

我正在尝试读取 HKCR\CLSID\ 子项中的特定子项。 {04271989-C4D2-####-####-############}

我将 # 用于可能因用户而异的值。此 CLSID 与 OneDrive 客户端相关。我想阅读并更改 DWORD。通过一些 google 的工作,我整理了以下代码。

    const HKEY_CLASSES_ROOT = &H80000000
    const REG_PATH = "CLSID\"
    const ONEDRIVE_MASK = "{04271989-C4D2-*"
    
    dim re: set re = New RegExp
    re.IgnoreCase = True
    re.Global = True
    re.Pattern = ONEDRIVE_MASK
    
    dim oReg: set oReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\.\root\default:StdRegProv")
    oReg.EnumKey HKEY_CLASSES_ROOT, REG_PATH, arrSubKeys
    Set WshShell = CreateObject( "WScript.Shell" )
    dim intValue
    dim intCnt
    
    for each subkey In arrSubKeys
        if re.test(subkey) then
           oReg.GetExpandedStringValue HKEY_CLASSES_ROOT, REG_PATH & subkey, "System.IsPinnedToNameSpaceTree", intValue
           WScript.Echo "CLSID Value: " & subkey
           WScript.Echo "System.IsPinnedToNameSpaceTree Value: " & intValue
           'WshShell.RegWrite "HKCR" & REG_PATH & subkey & "\System.IsPinnedToNameSpaceTree", 1,"REG_DWORD"
        end if
    next

结果是我要找的(子键)一直没有找到。我修改了脚本以仅输出它可以看到的所有子项,然后将该列表与 CLSID 注册表的导出进行比较,然后我将其擦除以仅显示 CLSID 以下一级内的子项列表。总列表超过 7800 个条目,在导出中找到以下子项列表,但对 vbscript 不可见。

{00425F68-FFC1-445F-8EDF-EF78B84BA1C7}  
{018D5C66-4533-4307-9B53-224DE2ED1FE6}  
{021E4F06-9DCC-49AD-88CF-ECC2DA314C8A}  
{1BF42E4C-4AF4-4CFD-A1A0-CF2960B8F63E}  
{20894375-46AE-46E2-BAFD-CB38975CDCE6}  
{2DAEC322-90B2-47E4-BB08-0DA841935A6B}  
{389510b7-9e58-40d7-98bf-60b911cb0ea9}  
{4410DC33-BC7C-496B-AA84-4AEA3EEE75F7}  
{47E6DCAF-41F8-441C-BD0E-A50D5FE6C4D1}  
{5AB7172C-9C11-405C-8DD5-AF20F3606282}  
{71DCE5D6-4B57-496B-AC21-CD5B54EB93FD}  
{7AFDFDDB-F914-11E4-8377-6C3BE50D980C}  
{82CA8DE3-01AD-4CEA-9D75-BE4C51810A9E}  
{8F3C945C-4222-45BD-BFFF-3B1A67BE13E3}  
{917E8742-AA3B-7318-FA12-10485FB322A2}  
{94269C4E-071A-4116-90E6-52E557067E4E}  
{9489FEB2-1925-4D01-B788-6D912C70F7F2}  
{9AA2F32D-362A-42D9-9328-24A483E2CCC3}  
{A0396A93-DC06-4AEF-BEE9-95FFCCAEF20E}  
{A78ED123-AB77-406B-9962-2A5D9D2F7F30}  
{A926714B-7BFC-4D08-A035-80021395FFA8}  
{BBACC218-34EA-4666-9D7A-C78F2274A524}  
{C5FF006E-2AE9-408C-B85B-2DFDD5449D9C}  
{CB3D0F55-BC2C-4C1A-85ED-23ED75B5106B}  
{CBDC4B31-CBE4-4A5B-BECF-64B29E47D2AD}  
{d1b22d3d-8585-53a6-acb3-0e803c7e8d2a}  
{D39E7BDD-7D05-46b8-8721-80CF035F57D7}  
{ED81C073-1F84-4ca8-A161-183C776BC651}  
{F241C880-6982-4CE5-8CF7-7085BA96DA5A}  

更多的互联网搜索我遇到了谈论 64 位和 32 位注册表项的人。我已经看到引用 64vs32 的注册表子项。

示例: HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node

但是有些 32 位的注册表项不能被 64 位读取,反之亦然……对我来说是新的概念。真的有这样的事情,还是我误读了我所看到的?如果是一回事,HKCR内部是否存在这种差异?和...你怎么能区分?

如果我错了,vbscript 中的问题是什么能够看到上面的条目?

开始意识到为什么我会遇到所有困难。我提供的 CLSID 列表都是用户定义的设置。这让我查看了注册表的 HKCU 部分,然后发现了我在 HKCR 中找不到的所有“特殊”CLSID。问题是 CLASSES_ROOT 中不存在这些注册表项,它们只是以视觉方式显示在那里,即使您也可以从那里导出它们。所以对脚本稍作改动。

    const HKEY_CURRENT_USER = &H80000001
const REG_PATH = "SOFTWARE\Classes\CLSID\"
const ONEDRIVE_MASK = "{04271989-C4D2-*"

Set objFSO=CreateObject("Scripting.FileSystemObject")
dim re: set re = New RegExp
re.IgnoreCase = True
re.Global = True
re.Pattern = ONEDRIVE_MASK

dim oReg: set oReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\.\root\default:StdRegProv")
oReg.EnumKey HKEY_CURRENT_USER, REG_PATH, arrSubKeys
Set WshShell = CreateObject( "WScript.Shell" )
dim intValue

for each subkey In arrSubKeys
    if re.test(subkey) then
       oReg.GetDWORDValue HKEY_CURRENT_USER, REG_PATH & subkey, "System.IsPinnedToNameSpaceTree", intValue
       WshShell.RegWrite "HKCU\" & REG_PATH & subkey & "\System.IsPinnedToNameSpaceTree", 0,"REG_DWORD"
    end if
next