1

我们的 VB6 遗留应用程序调用 RegSetValueEx 来设置注册表值。可以使用 regedit 轻松设置此注册表值。但是,当我们的应用程序尝试设置它时,RegSetValueEx 返回 5 - Access Is Denied。

我们使用相同的代码写入其他注册表项,一切正常。此外,用户是本地管理员。

密钥是使用 KEY_ALL_ACCESS 打开的,但我尝试使用(KEY_READ 或 KEY_WRITE),但也没有用。

Private Const READ_CONTROL = &H20000
Private Const KEY_QUERY_VALUE = &H1
Private Const KEY_SET_VALUE = &H2
Private Const KEY_CREATE_SUB_KEY = &H4
Private Const KEY_ENUMERATE_SUB_KEYS = &H8
Private Const KEY_NOTIFY = &H10
Private Const SYNCHRONIZE = &H100000
Private Const STANDARD_RIGHTS_ALL = &H1F0000
Private Const STANDARD_RIGHTS_EXECUTE = (READ_CONTROL)
Private Const STANDARD_RIGHTS_READ = (READ_CONTROL)
Private Const STANDARD_RIGHTS_REQUIRED = &HF0000
Private Const STANDARD_RIGHTS_WRITE = (READ_CONTROL)
Private Const KEY_READ = ((STANDARD_RIGHTS_READ Or KEY_QUERY_VALUE Or     KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY) And (Not SYNCHRONIZE))
Private Const KEY_WRITE = ((STANDARD_RIGHTS_WRITE Or KEY_SET_VALUE Or KEY_CREATE_SUB_KEY) And (Not SYNCHRONIZE))

Private Const KEY_CREATE_LINK = &H20
Private Const KEY_ALL_ACCESS = &H3F

Private Const REG_OPTION_NON_VOLATILE = 0&

Private Const HKEY_LOCAL_MACHINE = &H80000002

Dim hKey As Long
Dim e As Long
Dim lCreate As Long
Dim tSA As SECURITY_ATTRIBUTES
Dim keyOpened   As Boolean

e = RegCreateKeyEx(HKEY_LOCAL_MACHINE , "SOFTWARE\Classes\Word.Document.8", 0, "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, tSA, hKey, lCreate)

e = RegSetValueExLong(hKey, "BrowerFlags", 0&, REG_DWORD, newValue, 4)
4

2 回答 2

6

由于 Vista 于 2005 年发布,因此访问HKEY_LOCAL_MACHINE受到 UAC 的限制。您的用户很可能是管理员,但除非以提升的权限(RegEdit 是)启动进程,否则 UAC 将阻止写入访问。

为了写信给HKEY_LOCAL_MACHINE您,您需要确保在以提升权限运行的代码中执行注册表访问。为此,您需要:

  1. 将 UAC 清单添加到您的应用程序以强制它以提升的权限执行。但是,这意味着用户必须在每次运行应用程序时处理 UAC 提升提示。

  2. 如果您不想提升您的应用程序,您将需要将需要提升的代码部分分离到一个单独的进程中,或者在您的应用程序需要执行提升操作时通过COM Elevation Moniker实例化到一个 COM 对象中。

于 2015-03-02T14:54:07.323 回答
0

你真的要使用HKEY_LOCAL_MACHINE吗?由于 UAC 对应用程序的限制,这是无法访问的。一个简单的解决方法是HKEY_CURRENT_USER改用。

于 2019-07-25T16:19:13.560 回答