1. 程式人生 > >NSIS 註冊64位控制元件及修改登錄檔鍵的許可權方法

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