c++ - 来自 32 位进程的 64 位注册表项的 SetNamedSecurityInfo

标签 c++ windows winapi registry

我正在尝试使用 32 位应用程序中的 SetNamedSecurityInfo 为 64 位注册表项设置 ACL。由于只有 KEY_WOW64_32KEY 标志的 SetNamedSecurityInfo 限制,这是不可能的。

从 MSDN 上的一些帖子复制粘贴: 无法在 WOW64 中访问 64 位注册表项

注意:当使用 SetNamedSecurityInfo 或 GetNamedSecurityInfo 在注册表中获取或设置 ACL 时,无法从 32 位 DLL 或 EXE 访问 64 位注册表项。需要一个名为 SE_REGISTRY_WOW64_64KEY 的新 SE_OBJECT_TYPE 在 NTMARTA.DLL 中设置 KEY_WOW64_64KEY。

这意味着,例如,无法创建可在安装期间调整注册表安全设置的 32/64 位不可知 SETUP.EXE。解决方法是创建 64 位 DLL 或 EXE 并分发 bot

我的问题: 有什么解决方法可以在不创建 64 位应用程序的情况下解决此问题?

最佳答案

改为使用 SetSecurityInfo:

HKEY hSecKey;
if( RegOpenKeyEx( hHive, Subkey.c_str(), 0, ACCESS_SYSTEM_SECURITY | KEY_WOW64_64KEY, &hSecKey ) != ERROR_SUCCESS ) 
    return;

SetSecurityInfo(hSecKey, SE_REGISTRY_KEY, DACL_SECURITY_INFORMATION, NULL, NULL, &pDacl, NULL);

您必须先获得 SE_SECURITY_NAME 权限才能使用 ACCESS_SYSTEM_SECURITY 打开 key 。

关于c++ - 来自 32 位进程的 64 位注册表项的 SetNamedSecurityInfo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23245325/

相关文章:

python - 端口已被使用

python - 有没有办法使用 Python 发现用户的 Windows 桌面路径?

c# - 如何在网络浏览器控件内重新加载网页?

c++ - 除非将操作添加到工具栏,否则 Qt5 无法识别快捷方式

c++ - 将元素从 map 移动到另一个 map 的有效方法

c++ - 如何用字体计算多字符串的宽度和高度?

c - 在子菜单项上使用 EnableMenuItem

c++ - 如何限制窗口的文本区域?

C++ - 未调用函数模板特化

c++ - 使用原始套接字 (c++)