NSIS 非管理员账户下写入注册表失败

xinjichang 2017-06-27 12:28:13
我用NSIS写了一个安装包在非管理员权限下报错如下:
WriteReg: error creating key "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\App Paths\AppMainExe.exe"
WriteReg: error creating key "HKEY_CLASSES_ROOT\aaa"

是否不支持非管理员权限的安装包?
另外我看到有市场上面的安装包是可以写入的,这个就苦逼了,怎么办啊,大神们
...全文
664 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
莫失莫忘218 2019-02-21
  • 打赏
  • 举报
回复
我TM觉得赵四真的是CSDN的一个奇葩,哪里都有他真的是够了
oeisne 2017-10-16
  • 打赏
  • 举报
回复
引用 4 楼 zhao4zhong1 的回复:
仅供参考:
//如何以TrustedInstaller用户权限修改注册表
//通过代码将当前权限提升到TrustedInstaller很麻烦,但是可以通过获取备份还原权限来绕过DACL的监测机制。
#pragma comment(lib,"advapi32")
#include <stdio.h>
#include <string.h>
#include <windows.h>
bool EnablePriviledge(LPCTSTR lpSystemName) {
    HANDLE hToken;
    TOKEN_PRIVILEGES tkp = {1};
    if (OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,&hToken)) {
        if (LookupPrivilegeValue(NULL,lpSystemName,&tkp.Privileges[0].Luid)) {
            tkp.PrivilegeCount = 1;
            tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
            AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES) NULL, 0);
            if (GetLastError() != ERROR_SUCCESS) {
                CloseHandle(hToken);
                return false;
            }
        }
        CloseHandle(hToken);
    }
    return true;
}
int main() {
    bool bRet;
    LONG lResult;
    bRet = EnablePriviledge(SE_BACKUP_NAME);//这个函数是重点,让当前进程具备备份/还原的特权。
    if (bRet) {
        bRet = EnablePriviledge(SE_RESTORE_NAME);
        if (bRet) {
            HKEY hResult = NULL;
            DWORD dwDisposition;
            lResult = RegCreateKeyExW(HKEY_LOCAL_MACHINE,
                L"SOFTWARE\\Classes\\CLSID\\{871C5380-42A0-1069-A2EA-08002B30309D}\\shell\\NoAddOns",
                0,
                NULL,
                REG_OPTION_BACKUP_RESTORE,//这个是重点,传入这个参数可以直接忽视KEY_ALL_ACCESS这个参数的作用,直接以备份/还原的特权去操作注册表
                KEY_ALL_ACCESS,
                NULL,
                &hResult,
                &dwDisposition);
            if (lResult != ERROR_SUCCESS) {
                return 3;
            }
            wchar_t cValue[256] = L"";
            lResult = RegSetValueExW(hResult,L"LegacyDisable",NULL,REG_SZ,(LPBYTE)cValue,(wcslen(cValue)+1)*sizeof(wchar_t));
            if (lResult != ERROR_SUCCESS) {
                return 4;
            }
            RegCloseKey(hResult);
            printf("OK.\n");
            return 0;
        } else return 2;
    } else return 1;
}
赵四老师的复制粘贴,堪称绝技,已经可以完全不用看题目了。
赵4老师 2017-06-28
  • 打赏
  • 举报
回复
64 位 Windows 平台注意点之注册表重定向 http://www.cnblogs.com/jiake/p/4956218.html
赵4老师 2017-06-28
  • 打赏
  • 举报
回复
仅供参考:
//如何以TrustedInstaller用户权限修改注册表
//通过代码将当前权限提升到TrustedInstaller很麻烦,但是可以通过获取备份还原权限来绕过DACL的监测机制。
#pragma comment(lib,"advapi32")
#include <stdio.h>
#include <string.h>
#include <windows.h>
bool EnablePriviledge(LPCTSTR lpSystemName) {
    HANDLE hToken;
    TOKEN_PRIVILEGES tkp = {1};
    if (OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,&hToken)) {
        if (LookupPrivilegeValue(NULL,lpSystemName,&tkp.Privileges[0].Luid)) {
            tkp.PrivilegeCount = 1;
            tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
            AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES) NULL, 0);
            if (GetLastError() != ERROR_SUCCESS) {
                CloseHandle(hToken);
                return false;
            }
        }
        CloseHandle(hToken);
    }
    return true;
}
int main() {
    bool bRet;
    LONG lResult;
    bRet = EnablePriviledge(SE_BACKUP_NAME);//这个函数是重点,让当前进程具备备份/还原的特权。
    if (bRet) {
        bRet = EnablePriviledge(SE_RESTORE_NAME);
        if (bRet) {
            HKEY hResult = NULL;
            DWORD dwDisposition;
            lResult = RegCreateKeyExW(HKEY_LOCAL_MACHINE,
                L"SOFTWARE\\Classes\\CLSID\\{871C5380-42A0-1069-A2EA-08002B30309D}\\shell\\NoAddOns",
                0,
                NULL,
                REG_OPTION_BACKUP_RESTORE,//这个是重点,传入这个参数可以直接忽视KEY_ALL_ACCESS这个参数的作用,直接以备份/还原的特权去操作注册表
                KEY_ALL_ACCESS,
                NULL,
                &hResult,
                &dwDisposition);
            if (lResult != ERROR_SUCCESS) {
                return 3;
            }
            wchar_t cValue[256] = L"";
            lResult = RegSetValueExW(hResult,L"LegacyDisable",NULL,REG_SZ,(LPBYTE)cValue,(wcslen(cValue)+1)*sizeof(wchar_t));
            if (lResult != ERROR_SUCCESS) {
                return 4;
            }
            RegCloseKey(hResult);
            printf("OK.\n");
            return 0;
        } else return 2;
    } else return 1;
}
hurryboylqs 2017-06-27
  • 打赏
  • 举报
回复
你怎么提权的?代码怎么写?
xinjichang 2017-06-27
  • 打赏
  • 举报
回复
引用 1 楼 hurryboylqs 的回复:
有些是写入的时候才提权,不表示不具有管理员权限,要写入肯定要权限的
我已经提权了,但是还是没用,大神怎么办?
hurryboylqs 2017-06-27
  • 打赏
  • 举报
回复
有些是写入的时候才提权,不表示不具有管理员权限,要写入肯定要权限的

15,977

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧