VB6注册表项值问题

VB6注册表项值问题,vb6,registry,key,edit,Vb6,Registry,Key,Edit,在VB6中,我使用以下代码添加到注册表 Dim x As Object x = CreateObject("WScript.Shell") x.RegWrite "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Shell", "MADNESS" 但是,它会在以下位置创建密钥: HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT

在VB6中,我使用以下代码添加到注册表

Dim x As Object
x = CreateObject("WScript.Shell")
x.RegWrite "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Shell", "MADNESS"
但是,它会在以下位置创建密钥:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\Winlogon\Shell
而不是:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon

感谢您的帮助。

这似乎是因为您有一个64位操作系统,并且您正在运行一个32位(x86)应用程序,该应用程序由Windows的“Windows On Windows”(WOW)功能处理。基本上,它允许您在x64 Windows操作系统上运行x86程序。x86程序通常有自己的注册表项结构(即
Wow6432Node
)和自己的程序文件文件夹(即
程序文件(x86)
)。您可以尝试使用类似使用WinAPI钩子的东西。这可能允许您绕过该问题,直接写入所需的密钥。不过,我不确定Windows是否有防止x86应用程序写入注册表x64部分的安全措施。(我不明白为什么会这样。)

看起来这是因为您有一个64位操作系统,并且您正在运行一个32位(x86)应用程序,该应用程序由Windows的“Windows On Windows”(WOW)功能处理。基本上,它允许您在x64 Windows操作系统上运行x86程序。x86程序通常有自己的注册表项结构(即
Wow6432Node
)和自己的程序文件文件夹(即
程序文件(x86)
)。您可以尝试使用类似使用WinAPI钩子的东西。这可能允许您绕过该问题,直接写入所需的密钥。不过,我不确定Windows是否有防止x86应用程序写入注册表x64部分的安全措施。(我不明白为什么会这样。)

您可以使用shell
C:\Windows\System32\cscript.exe
这是x64版本


仅供参考:x86版本是
C:\Windows\SysWOW64\cscript.exe

您可以shell
C:\Windows\System32\cscript.exe
,这是x64版本


仅供参考:x86版本是
C:\Windows\SysWOW64\cscript.exe

首先,我将停止使用WScript.Shell并切换到此注册表访问类:

一开始使用它有点混乱,但它是可靠的,并且提供了访问64位注册表项的内置支持,而不是重新定向的WOW6432节点。只需在类的.Path方法中设置所需的访问权限即可。以下是一个未经测试的示例:

Dim objRegistry as New UniRegistry
Dim objHKLMStartup as New UniRegistry

Set objHKLMStartup = objRegistry.Path([hKey Local Machine], "SOFTWARE\Microsoft\Windows\CurrentVersion\Run", [Registry: Read] + [Registry: WOW64 64-bit])

然后,您可以对objHKLMStartup中的每个变量使用,以提取给定注册表路径中的任何/所有值。

首先,我将停止使用WScript.Shell并切换到此注册表访问类:

一开始使用它有点混乱,但它是可靠的,并且提供了访问64位注册表项的内置支持,而不是重新定向的WOW6432节点。只需在类的.Path方法中设置所需的访问权限即可。以下是一个未经测试的示例:

Dim objRegistry as New UniRegistry
Dim objHKLMStartup as New UniRegistry

Set objHKLMStartup = objRegistry.Path([hKey Local Machine], "SOFTWARE\Microsoft\Windows\CurrentVersion\Run", [Registry: Read] + [Registry: WOW64 64-bit])
然后,可以对objHKLMStartup中的每个变量使用,以提取给定注册表路径中的任何/所有值