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

    xiaoxiao2021-03-25  54

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

    转自:http://blog.csdn.net/xiliang_pan/article/details/12647573

    转载请注明原文地址: https://ju.6miu.com/read-150361.html

    最新回复(0)