注册表中 HKEY_CURRENT_USER 键下的内容隶属当前用户,所以当你以不同用户登陆时该键下的内容都是不尽相同的。但有时候我们有读取指定用户该键下内容的需求。比如,我们有一个服务程序运行在 Session0, SYSTEM 权限,而我们想读取的却是当前登陆到本地控制台的用户的 IE 代理服务器设置参数。我们当然不能直接从服务中打开 HKEY_CURENT_USER 键, 用我们当前令牌打开的是 SYSTEM 的 HKEY_CURRENT_USER 键,或许我们想可以通过当前线程扮演控制台用户来读取这个键

ImpersonateLoggedOnUser(hToken);

RegOpenKeyEx(HKEY_CURRENT_USER...);

RevertToSelf();

其实这个方法也是不行的,因为虽然我们取得了控制台用户的令牌,并且模仿该用户,但因为在当前空间并没有装载该用户的环境变量,用户上下文,所以这里的 RegOpenKeyEx 调用还是失败的。

好在微软为我们准备了 LoadUserProfile();

首先我们可以用

WTSGetActiveConsoleSessionId 取得当前控制台会话的 id, 这个API xp/2003 以上才有,2000 没有怎么办?2000直接可以省却这一步了,因为 2000 不支持用户切换,所以本地控制台永远运行在 Session0.

然后你可以用 WTSQueryUserToken 获得指定 Session 已登陆用户令牌。这个API依然是 xp/2003 才支持, 2000 怎么办,自己想办法吧(是不是可以打开 explorer.exe 的令牌看看 :) )。

然后 LoadUserProfile 装载该用户的环境变量了。

这段代码贴在下面吧, 可能不完整,我使用的这几个 API 都是动态装载的, 因为我们的软件可能要支持 98, 所以只能动态装载,否则就根本不能运行了。注意一下粗体部分,关键就在这里了。不清楚就看看 MSDN 吧,微软讲得很清楚了。向 MSDN team 致敬!

HANDLE hToken = NULL;
    BOOL bImpersonated = FALSE;
    PROFILEINFOA cuProfileInfo;
    TCHAR szUsername[MAX_PATH];
    DWORD dwUsernameLen = MAX_PATH;
    
    if(GetConsoleUserToken(&hToken))
    {
        if(ImpersonateLoggedOnUser(hToken))
        {
            bImpersonated = TRUE;
            //MessageBox(NULL, "I.. L.. User OK", "", NULL);
        }
        
        GetUserName(szUsername, &dwUsernameLen);
        memset(&cuProfileInfo, 0, sizeof(cuProfileInfo));
        cuProfileInfo.dwSize = sizeof(PROFILEINFOA);
        cuProfileInfo.lpUserName = szUsername;
        cuProfileInfo.dwFlags = 1;
        
        if(bImpersonated) 
        {
            RevertToSelf();
            bImpersonated = FALSE;
        }
        
        if(pfnLoadUserProfile)
        {
            if(pfnLoadUserProfile(hToken, &cuProfileInfo))
            {
                RegOpenKeyEx((struct HKEY__ *)cuProfileInfo.hProfile, IEPROXY_LOCALUSER_KEY, 0, KEY_QUERY_VALUE, &regKeyFrom);
                //MessageBox(NULL, "Open spc key", "", NULL);
            }
            else
            {
                RegOpenKeyEx(HKEY_CURRENT_USER, IEPROXY_LOCALUSER_KEY, 0, KEY_QUERY_VALUE, &regKeyFrom);
            }
        }
        //MessageBox(NULL, "ImpersonateLoggedOnUser Successful", "atagtctl", NULL);
    }
    else
    {
        RegOpenKeyEx(HKEY_CURRENT_USER, IEPROXY_LOCALUSER_KEY, 0, KEY_QUERY_VALUE, &regKeyFrom);
    }

system 权限读取注册表HKEY_CURRENT_USER相关推荐

  1. windows下服务或SYSTEM权限读取当前用户注册表HKEY_CURRENT_USER

    最近一直在给一个程序增加一个功能,需要修改注册表 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MountP ...

  2. c 语言读取注册表信息,C++读取注册表的实现方法

    C++读取注册表 GetRegValue.h: #ifndef __GETREGVALUE_H__ #define __GETREGVALUE_H__ #include //------------- ...

  3. 使用扩展存储过程xp_regread读取注册表信息

    T-SQL使用扩展存储过程[master].[dbo].[xp_regread]读取注册表信息. 如下注册表: Insus.NET为了做演示,写了一个用户自定义函数[dbo].[GetServerLo ...

  4. php 读取注册表 不用wscript.shell,WebShell的检测技术_91Ri.org

    一.Webshell 的常见植入方法 -启明星辰  Leylo Trent WebShell 攻击是常见的用来控制Web 服务器的攻击方法,WebShell 文件通常是可执行的脚本文件,例如asp, ...

  5. java读取注册表_Java通过CMD方式读取注册表任意键值对代码实践

    需要读取如图所示注册表[HKEY_LOCAL_MACHINE\SOFTWARE\EasyDrv7]节点下的[DateTime]的值 直接上代码: package com.beibei.common.u ...

  6. 求助:Windows Service 读取注册表键值

    最近项目需要程序监控记录用户使用和打开的文件,于是做了一个使用Windows Service监控Recent文件夹中文件增加和更改的程序, 但是需要在服务程序确定Recent文件夹的路径,使用Regi ...

  7. 读取注册表REG_DWORD类型的键值

    读取注册表REG_DWORD类型的键值: DWORD dwRet = 0;  HKEY hKey;  if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SYSTEM// ...

  8. js读取注册表的键值

    try { var shell = new ActiveXObject("WScript.Shell"); --读取注册表 var  key  = shell.RegRead(&q ...

  9. CReg类轻松读取注册表

    //======================================================================== //TITLE: // CReg类轻松读取注册表 ...

最新文章

  1. 图书馆图书上架_【消息】暑假好去处,明光市图书馆很多新书上架啦......
  2. 文本信息检索基本知识【转】
  3. 的远程烧写_农用气象环境远程监测管理系统
  4. 程序编码(机器级代码+汇编代码+C代码+反汇编)
  5. 转载-zookeeper在kafka中的作用
  6. JQ js选择节点操作
  7. 程序员做到年薪60万也不去炫富,背后原因曝光,麻烦做个人吧
  8. Javascript中最常用的经典技巧
  9. Source Insight 中查看日文注释
  10. J2EE项目数据字典设计
  11. 华为荣耀4X的ROOT
  12. 如何系统地自学 Python?
  13. SiamCAR: Siamese Fully Convolutional Classification and Regression for Visual Tracking
  14. python sys.path用法
  15. 关于11月28日CSDN遭受网络攻击的情况说明
  16. 设置微信PC端代理使用burp抓取微信小程序的数据包
  17. Python SDK是什么
  18. 岛屿的个数java_LeetCode 200:岛屿数量 Number of Islands
  19. 从0到1,一文掌握用户画像标签体系
  20. 2017年浙江工业大学大学生程序设计迎新赛预赛 H - 栗酱的文明

热门文章

  1. 编程导师Ivor Horton新作《Java 7入门经典》即将出版
  2. 【论文笔记】ParamE模型学习
  3. Ruoyi-Vue是如何实现微信公众号免密登录的
  4. 让View具有减速效果的动画——FlingAnimation
  5. ftp 发生意外错误 0x8ffe2740
  6. linux环境下写的C,一元二次方程示例
  7. 【转】Maximal Information Coefficient (MIC)最大互信息系数详解与实现
  8. [IMX6Q][Android4.4] Audio添加控制MIC左右声道接口
  9. 地图随意搜---情景地图
  10. 企业服务器固态硬盘寿命,SSD固态硬盘使用寿命短?_企业存储技术与评测-中关村在线...