1 注册控件
注册32位控件:RegDLL "c:\windows\system32\x.dll"
注册64位控件:
禁止文件重定向,使用系统命令注册控件,如下:
ExecWait ‘“$SYSDIR\regsvr32.exe" /s "c:\windows\system32\x_64.dll"'
可以参考:Library.nsh
2 修改注册表键权限
代码片段:
HKEY hKey = NULL;
// 区分32、64位注册表
ULONG rv = RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE\\test\\test1",0,KEY_ALL_ACCESS|KEY_WOW64_32KEY|WRITE_DAC,&hKey);
//ACL (access control list)访问控制列表
PACL pOldDacl=NULL;
PACL pNewDacl=NULL;
DWORD dRet;
EXPLICIT_ACCESS eia;
//security安全 descriptor描述符
PSECURITY_DESCRIPTOR pSID=NULL;
//DACL 自由访问控制列表
//ACL 管制对象访问两种类型的ACL 自由决定的DACL和系统SACL
//DACL管制对象访问SACL管制审核
//SID 安全标示符security identifier
//SAM是windows系统 的一个系统用户账号管理文件 security account manager
// ObjectType 必须为 SE_REGISTRY_KEY,32 or 64位注册表由handle参数指定
dRet = GetSecurityInfo(hKey,SE_REGISTRY_KEY,DACL_SECURITY_INFORMATION,NULL,NULL,&pOldDacl,NULL,&pSID);// 获取SAM主键的DACL
if(dRet != ERROR_SUCCESS)
{
return 1;
}
//创建一个ACE,允许Users组成员完全控制对象,并允许子对象继承此权限
ZeroMemory(&eia,sizeof(EXPLICIT_ACCESS));
BuildExplicitAccessWithName(&eia,"Everyone",KEY_ALL_ACCESS,SET_ACCESS,SUB_CONTAINERS_AND_OBJECTS_INHERIT);
// 将新的ACE加入DACL
//ACL 访问控制列表
//DACL 自由访问控制列表
//SACL 系统访问控制列表
dRet = SetEntriesInAcl(1,&eia,pOldDacl,&pNewDacl);
if(dRet != ERROR_SUCCESS)
{
return 2;
}
// 更新主键的DACL
dRet = SetSecurityInfo(hKey,SE_REGISTRY_KEY,DACL_SECURITY_INFORMATION,NULL,NULL,pNewDacl,NULL);
if(dRet != ERROR_SUCCESS)
{
return 3;
}
SetSecurityInfo VS GetNamedSecurityInfo(32位程序不能修改64位注册表键的权限,只有SE_REGISTRY_WOW64_32KEY,而没有SE_REGISTRY_WOW64_64KEY)。