RegOpenKeyEx 打开注册表 拒绝访问

pans_y 2018-10-20 04:27:03
打开 HKEY_LOCAL_MACHINE\BCD00000000 时,error code 是5。
请问,怎样才能正确获取 系统信息相关的注册表信息。
例如:HKEY_LOCAL_MACHINE\BCD00000000\Objects
(论坛小白一枚,怎么发分?)
...全文
1005 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-10-23
  • 打赏
  • 举报
回复
pans_y 2018-10-23
  • 打赏
  • 举报
回复
引用 2 楼 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;
}
按照赵老师的方法,解决问题了。 谢谢赵老师。
pans_y 2018-10-23
  • 打赏
  • 举报
回复
引用 1 楼 qq_39850605 的回复:
你可能申请的权限太大了,试一下RegOpenKeyEx(HKEY_CURRENT_USER, strRegPath.toStdString().c_str(), 0, KEY_READ|KEY_WRITE, &hKey)
可能是我说的不清楚,谢谢。
赵4老师 2018-10-21
  • 打赏
  • 举报
回复
//如何以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;
}
@风轻云淡_ 2018-10-20
  • 打赏
  • 举报
回复
你可能申请的权限太大了,试一下RegOpenKeyEx(HKEY_CURRENT_USER, strRegPath.toStdString().c_str(), 0, KEY_READ|KEY_WRITE, &hKey)

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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