当 Windows UAC 设置为始终通知时,无法写入注册表



我有一个C++应用程序,我们将设置写入注册表(在我的应用程序的HKEY_CURRENT_USER和HKEY_LOCAL_MACHINE下)。当 Windows 用户访问控制设置为"始终通知"时,RegCreateKeyEx 方法返回拒绝访问,并且它不会写入HKEY_LOCAL_MACHINE但会在注册表中成功写入HKEY_CURRENT_USER。我正在使用此方法编写:

lRet = RegCreateKeyEx( m_hSWRootKey, LPCTSTR(strKey), 
0, _T(""), m_dwCreationFlag, KEY_WRITE | KEY_READ, 
NULL, &hKey, &Disposition );

当 UAC 设置为"从不通知"时,此方法工作正常。

它不写信给HKEY_LOCAL_MACHINE的原因是什么?如何覆盖 Windows UAC 设置,以便能够在它设置为"始终通知"时进行编写?

请指教。

除非您具有管理员权限,否则无法写入HKEY_LOCAL_MACHINE。 对于基于NT的Windows版本来说,这一直都是如此。 UAC 的更改是,默认情况下,管理员用户使用标准用户令牌运行,并且仅提升以获取需要提升权限的操作的管理员权限。

您有两种选择:

  1. 找到一种方法来实现您的目标,而无需写信给HKEY_LOCAL_MACHINE.
  2. 要求用户获取写入HKEY_LOCAL_MACHINE的应用部分的管理员权限。

在这些选项中,第一个是迄今为止的首选。

如果采用

仅允许以管理员身份运行应用程序的路径,则可以在 Visual Studio 中设置清单:

项目>>属性>>配置属性>>链接器>>清单文件>> UAC 执行级别。

理想情况下,您会找到一些不需要修改的方法HKEY_LOCAL_MACHINE

最新更新