我有一个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 的更改是,默认情况下,管理员用户使用标准用户令牌运行,并且仅提升以获取需要提升权限的操作的管理员权限。
您有两种选择:
- 找到一种方法来实现您的目标,而无需写信给
HKEY_LOCAL_MACHINE
. - 要求用户获取写入
HKEY_LOCAL_MACHINE
的应用部分的管理员权限。
在这些选项中,第一个是迄今为止的首选。
仅允许以管理员身份运行应用程序的路径,则可以在 Visual Studio 中设置清单:
项目>>属性>>配置属性>>链接器>>清单文件>> UAC 执行级别。
理想情况下,您会找到一些不需要修改的方法HKEY_LOCAL_MACHINE