要禁用注册表重定向(也称为注册表虚拟化),通常需要使用KEY_WOW64_32KEY
或KEY_WOW64_64KEY
访问权限标志,而不是通过RegOpenKeyEx
函数的ulOptions
参数。这些标志用于指定在32位应用程序运行在64位Windows系统上时,应该访问哪个版本的注册表(32位或64位)。
但是,请注意,REG_OPTION_DONT_REDIRECT
实际上不是RegOpenKeyEx
函数的参数。它是RegCreateKeyEx
、RegSetValueEx
等函数的ulOptions
参数的一个选项,用于阻止对特定注册表项的重定向(比如针对“已知文件夹”的重定向)。
在VB6中,要访问64位注册表视图(从32位应用程序)或禁用虚拟化,您应该这样做:
-
如果您正在运行32位VB6应用程序并希望访问64位注册表视图,您可以使用
KEY_WOW64_64KEY
作为samDesired
参数的一部分。 -
如果您想要阻止对特定注册表项的重定向(这通常不是通过
RegOpenKeyEx
实现的),您可能需要使用其他方法,如直接调用NtCreateKey
(这是一个未公开的Native API,不推荐在应用程序中使用,因为它可能不稳定且不受支持)。
下面是一个示例,展示如何使用VB6和RegOpenKeyEx
访问64位注册表(从32位应用程序):
vbPrivate Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" ( _
ByVal hKey As Long, _
ByVal lpSubKey As String, _
ByVal ulOptions As Long, _
ByVal samDesired As Long, _
ByRef phkResult As Long _
) As Long
Private Const HKEY_LOCAL_MACHINE = &H80000002
Private Const KEY_READ = &H20019
Private Const KEY_WOW64_64KEY = &H100
Function Open64BitRegKey(subKey As String, ByRef hKeyResult As Long) As Boolean
Dim retVal As Long
' Combine KEY_READ with KEY_WOW64_64KEY to access the 64-bit view
retVal = RegOpenKeyEx(HKEY_LOCAL_MACHINE, subKey, 0, KEY_READ Or KEY_WOW64_64KEY, hKeyResult)
Open64BitRegKey = (retVal = 0) ' Success is indicated by a return value of 0
End Function
在这个例子中,Open64BitRegKey
函数试图打开64位本地机器注册表中的一个键。如果成功,它将返回True
,并将打开的键的句柄存储在hKeyResult
中。
KEY_READ 权限不够,要删除,添加等一切权限
如果您在VB6或VB.NET中遇到KEY_READ
权限不够,想要删除、添加或修改注册表项,并需要所有权限(包括读取、写入、删除等),那么您应该使用更高级别的权限标志。
在Windows API中,权限标志是组合使用的,以表示您希望拥有的访问级别。对于注册表操作,您通常会使用RegistryPermission
类(在.NET中)或特定的权限标志(在VB6或直接使用API时)。
以下是在VB6中设置注册表项权限的步骤的概述,但请注意,由于VB6的限制,这些步骤可能需要结合Windows API的直接调用或使用其他方法来实现:
-
确定所需的权限:
KEY_READ
:读取子键和值的权限。KEY_WRITE
:创建子键、删除子键或值的权限。KEY_ALL_ACCESS
:所有可能的权限,包括读取、写入、删除等。
-
打开注册表项:
使用RegOpenKeyEx
(或VB中的相应方法)打开您想要修改的注册表项,并使用适当的权限标志(如KEY_ALL_ACCESS
)。 -
修改权限(如果需要):
在VB6中直接修改注册表项的权限可能比较复杂,因为VB6本身不提供这样的功能。您可能需要结合Windows API的RegSetKeySecurity
函数来修改注册表项的安全描述符。但是,这通常需要深入的安全知识和编程技巧。 -
执行所需的操作:
一旦您拥有适当的权限,就可以使用VB6的注册表函数(如RegSetValueEx
、RegDeleteKey
等)或Windows API的相应函数来执行读取、写入、删除等操作。 -
关闭注册表项:
完成操作后,确保关闭注册表项以释放资源。
如果您在.NET环境中工作(例如VB.NET),那么您可以使用Microsoft.Win32
命名空间中的类来更容易地管理注册表权限和操作。例如,您可以使用RegistrySecurity
类来修改注册表项的安全设置,并使用RegistryKey
类来执行读取、写入和删除操作。
注意:修改注册表是一个敏感操作,可能会导致系统不稳定或数据丢失。在执行任何注册表操作之前,请务必备份您的数据,并确保您完全了解您正在做什么。此外,修改系统注册表通常需要管理员权限。