NSIS 註冊64位控制元件及修改登錄檔鍵的許可權方法
阿新 • • 發佈:2019-01-26
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
//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引數指定
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
if(dRet != ERROR_SUCCESS)
{
return 3;
}
SetSecurityInfo VS GetNamedSecurityInfo(32位程式不能修改64位登錄檔鍵的許可權,只有SE_REGISTRY_WOW64_32KEY,而沒有SE_REGISTRY_WOW64_64KEY)。