MFC 使用 RegOpenKeyEx 打开注册表的时候,32位系统和64位系统上权限参数不一样

张亚成 2017-04-20 06:48:46
在使用 RegOpenKeyEx 打开注册表的时候,使用 KEY_ALL_ACCESS 并没有打开所有的权限,如果使用 32 位 的系统 必须附加 KEY_WOW64_32KEY 权限,如果使用 64 位的系统,必须使用 附加
KEY_WOW64_64KEY 权限。

...全文
1326 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
张亚成 2017-08-24
  • 打赏
  • 举报
回复
引用 12 楼 SXJIAKE 的回复:
[quote=引用 11 楼 zhangyacheng_1 的回复:] [quote=引用 10 楼 SXJIAKE 的回复:] 楼主的理解可能有误,这个不取决于你使用的系统。而是在 64 位系统上时,该标志位决定你访问的是 32 位注册表,还是 64 位注册表。
我是有一个程序访问注册表,对注册表进行读写操作,但是这个程序需要在32位的windows7 和 64 位的windows 7 上都能运行。[/quote]运行是肯定能运行的,主要是看你要往哪里写。如果没有特殊要求,就直接 32 位和 64 位一样处理即可。[/quote] 在 访问注册表的时候使用 权限为: KEY_ALL_ACCESS | KEY_WOW64_64KEY 就可以了、。。。。。
「已注销」 2017-08-22
  • 打赏
  • 举报
回复
引用 11 楼 zhangyacheng_1 的回复:
[quote=引用 10 楼 SXJIAKE 的回复:] 楼主的理解可能有误,这个不取决于你使用的系统。而是在 64 位系统上时,该标志位决定你访问的是 32 位注册表,还是 64 位注册表。
我是有一个程序访问注册表,对注册表进行读写操作,但是这个程序需要在32位的windows7 和 64 位的windows 7 上都能运行。[/quote]运行是肯定能运行的,主要是看你要往哪里写。如果没有特殊要求,就直接 32 位和 64 位一样处理即可。
张亚成 2017-08-19
  • 打赏
  • 举报
回复
引用 10 楼 SXJIAKE 的回复:
楼主的理解可能有误,这个不取决于你使用的系统。而是在 64 位系统上时,该标志位决定你访问的是 32 位注册表,还是 64 位注册表。
我是有一个程序访问注册表,对注册表进行读写操作,但是这个程序需要在32位的windows7 和 64 位的windows 7 上都能运行。
「已注销」 2017-08-03
  • 打赏
  • 举报
回复
楼主的理解可能有误,这个不取决于你使用的系统。而是在 64 位系统上时,该标志位决定你访问的是 32 位注册表,还是 64 位注册表。
「已注销」 2017-08-01
  • 打赏
  • 举报
回复
// 64 位系统上,访问 HKLM\Software\Wow6432Node\Microsoft...
// 正确!
RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("Software\\Microsoft"), 0, KEY_READ | KEY_WOW64_32KEY, &hKey);
// 错误!有可能得到正确结果,但未经测试,写法不被微软推荐。
RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("Software\\Wow6432Node\\Microsoft"), 0, KEY_READ | KEY_WOW64_32KEY, &hKey);
// 错误!有可能得到正确结果,但未经测试,写法不被微软推荐。
RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("Software\\Wow6432Node\\Microsoft"), 0, KEY_READ, &hKey);

// 64 位系统上,访问 HKLM\Software\Microsoft...
// 正确!
RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("Software\\Microsoft"), 0, KEY_READ | KEY_WOW64_64KEY, &hKey);
// 错误!64 位程序能得到正确结果,32 位程序无法得到正确结果。
RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("Software\\Microsoft"), 0, KEY_READ, &hKey);
「已注销」 2017-08-01
  • 打赏
  • 举报
回复
注册表视图访问控制权限位: KEY_WOW64_32KEY KEY_WOW64_64KEY 在 64 位系统上: 32 位程序,不使用任何权限位,默认访问 32 位注册表。 64 位程序,不使用任何权限位,默认访问 64 位注册表。 使用 KEY_WOW64_32KEY,不管 32 位还是 64 位程序,均访问 32 位注册表。 使用 KEY_WOW64_64KEY,不管 32 位还是 64 位程序,均访问 64 位注册表。 在 32 位系统上,这些标志位无效,因为只有一个视图,就是 32 位。 在 64 位系统上,32 位注册表通常指位于 Wow6432Node 键下面的子键。 访问 32 位注册表的键值,路径不能直接带 Wow6432Node,而是通过 KEY_WOW64_* 标志来控制。
赵4老师 2017-08-01
  • 打赏
  • 举报
回复
64 位 Windows 平台注意点之注册表重定向 http://www.cnblogs.com/jiake/p/4956218.html
张亚成 2017-07-31
  • 打赏
  • 举报
回复
引用 5 楼 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;
}
你意思使用你的这个方法,不管是windows 7 64位 还是 32 位都可以了吗? 有没有什么方法是可以获取操作系统的位数呢?
赵4老师 2017-07-31
  • 打赏
  • 举报
回复
仅供参考:
//如何以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;
}
张亚成 2017-07-30
  • 打赏
  • 举报
回复
引用 2 楼 zhao4zhong1 的回复:
64 位 Windows 平台注意点之注册表重定向 http://www.cnblogs.com/jiake/p/4956218.html
好像不行啊,不知道是我没有看懂还是怎么回事?
张亚成 2017-06-21
  • 打赏
  • 举报
回复
引用 1 楼 VisualEleven 的回复:
请参考MSDN文档,里面有说明:https://msdn.microsoft.com/en-us/library/windows/desktop/ms724878(v=vs.85).aspx
这个msdn 我以前看过,但是确实没有解决问题,你参考这个弄成功了吗?
赵4老师 2017-04-21
  • 打赏
  • 举报
回复
64 位 Windows 平台注意点之注册表重定向 http://www.cnblogs.com/jiake/p/4956218.html
Eleven 2017-04-20
  • 打赏
  • 举报
回复

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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