RegSetValueEx returns "Access is denied",即使 regedit 允许同一用户编辑此值

RegSetValueEx returns "Access is denied", even though regedit allows the same user to edit this value

我们的 VB6 遗留应用程序调用 RegSetValueEx 来设置注册表值。可以使用 regedit 轻松设置此注册表值。但是,当我们的应用程序尝试设置它时,RegSetValueEx returns 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)

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

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

  1. 将 UAC 清单添加到您的应用程序以强制其以提升的权限执行。但是,这意味着每次应用程序 运行.

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

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