SetNamedSecurityInfo用于来自32位进程的64位注册表项

时间:2014-04-23 13:09:10

标签: c++ windows winapi registry

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

从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位应用程序,有什么解决方法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

改为使用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打开密钥。