NSIS 注册64位控件及修改注册表键的权限方法

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)。  

 

 

你可能感兴趣的:(NSIS 注册64位控件及修改注册表键的权限方法)