【问题标题】:Some SubKeys can't be read with Vbscript?Vbscript 无法读取某些子键?
【发布时间】:2021-11-23 11:59:15
【问题描述】:

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

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

    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 能够看到上述条目的问题是什么?

【问题讨论】:

  • 您是否尝试过从提升的(管理员:)Cmd 提示符运行脚本?
  • 这能回答你的问题吗? How to run vbs as administrator from vbs?
  • 从提升的命令提示符运行脚本会产生相同的结果。它仍然看不到已识别的子键。
  • 我还对脚本可以看到的子键和它不能看到的子键的权限进行了比较。我看不出有什么区别。
  • 任何人都可以对自己的注册表运行脚本,看看这是否常见?添加以下行 在当前行 10 之前添加以下内容 outFile=".\OneDriveScriptOutput.txt" 在当前行 14 之后添加以下内容 objFile.Write subkey & vbCrLf 在脚本末尾添加以下内容 objFile.Close 比较该列表,以从注册表的 clsid 导出。 1. 对所有条目进行排序,这样所有的 {clsid 条目} 就组合在一起了。 2.删除所有不以“{”开头的记录 3.添加一个FIND("]", A1:A25000) 4.按新列排序 5.删除所有找到“]”的条目

标签: vbscript registry 32bit-64bit


【解决方案1】:

开始意识到为什么我会遇到所有困难。我提供的 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

【讨论】:

    猜你喜欢
    • 2018-12-05
    • 1970-01-01
    • 2015-04-20
    • 2019-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-04
    • 2021-03-06
    相关资源
    最近更新 更多