服务 HKEY_CURRENT_USER HKEY_USER 读取 RegQueryValueEx 注册表

我在服务程序中使用RegQueryValueEx读取注册表HKEY_CURRENT_USER下的内容,发现读取到的内容不是预期的内容。

原因是:

1.服务运行在系统权限之下,而不是任何一个用户

2.HKEY_CURRENT_USER存储的是当前用户的信息

================>导致在服务中读取HKEY_CURRENT_USER,不是当前登录的用户。同样,写入也不是。

所以如果我要操作HKEY_CURRENT_USER之内的键值,就必须模拟当前用户去读取。

有几种思路可以做到:

1.创建一个用户进程去操作注册表,使用CreateProcessAsUser函数可以做到

2.让当前线程模拟当前登录用户的安全上下文(lets the calling thread impersonate the security context of a logged-on user)。使用ImpersonateLoggedOnUser 函数可以做到。

第一个方法需要用到另外一个程序,感觉比较麻烦。

以下演示第二种方法:

1.要调用ImpersonateLoggedOnUser 函数,就先要获得该用户的令牌 (token)

DWORD pid = FindProcessByName(L"explorer.exe");
HANDLE ph = OpenProcess (PROCESS_ALL_ACCESS, FALSE, pid); 
HANDLE token; 
OpenProcessToken (ph, TOKEN_QUERY | TOKEN_DUPLICATE, &token);

2.模拟登录用户的安全上下文

ImpersonateLoggedOnUser (token);

3.获取用户名

wchar_t szBuf[MAX_PATH] = L"";

DWORD dwRet = MAX_PATH;
GetUserName(szBuf, &dwRet);

4.到这里已经模拟完了,别忘记返回原来的安全上下文
 RevertToSelf();

5.获取sid
PSID pSid = NULL;
LPWSTR sid;
GetAccountSid(szBuf, &pSid); //获取得到的是一个结构体
ConvertSidToStringSid(pSid, &sid); //从结构体中得到sid串

6.构造 sid+注册表位置
 例如想读取的注册表位置为,Software\\Microsoft\\Windows\\CurrentVersion\\Intern Settings\\

你得到的sid为:S-1-5-21-1229272821-1897051121-682003330-1003

那么,应该组合成 :"S-1-5-21-1229272821-1897051121-682003330-1003\\Software\\Microsoft\\Windows\\CurrentVersion\\Intern Settings\\";

7.可以读取了,注意RegQueryValueEx的参数“HKEY_USERS”
keyPosition就是上面构造的那一串。
bool result = RegOpenKeyEx(HKEY_USERS,keyPosition,0,KEY_READ,&hKEY);
DWORD it = sizeof(DWORD);
DWORD dwType = REG_NONE;
DWORD dwCount = 0;
RegQueryValueEx(hKEY, 你要读的键值名, NULL, &dwType, NULL, &dwCount);   //获取长度
RegQueryValueEx(hKEY,你要读的键值名, NULL, &dwType, (LPBYTE)(&it), &dwCount);//读取

流程就是这样,有什么bug,欢迎反映

补上前面用到的两个函数:

//
// 查找进程pid
//
DWORD FindProcessByName(LPCWSTR ProcessName)
{
 HANDLE hHandle;
 DWORD i;
 BOOL Next;
 wchar_t szName[MAX_PATH];

PROCESSENTRY32 p32 = {sizeof(p32)};
 hHandle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL); 
 Next = Process32First(hHandle, &p32);

i = 0; 
 while (Next) 
 { 
  wsprintf(szName, L"%s", p32.szExeFile);
  if (lstrcmpi(szName, ProcessName) == 0)
  {
   return p32.th32ProcessID ;
  }
  Next = Process32Next(hHandle, &p32); 
  i++; 
 } 
 CloseHandle(hHandle); 
 return 0;
}

//
//获取用户sid
//
bool GetAccountSid(LPTSTR AccountName, PSID *Sid)
{
 PSID pSID = NULL;
 DWORD cbSid = 0;
 LPTSTR DomainName = NULL;
 DWORD cbDomainName = 0;
 SID_NAME_USE SIDNameUse;
 BOOL  bDone = FALSE;

try
 {
  if(!LookupAccountName(NULL,
   AccountName,
   pSID,
   &cbSid,
   DomainName,
   &cbDomainName,
   &SIDNameUse))
  {
   pSID = (PSID)malloc(cbSid);
   DomainName = (LPTSTR)malloc(cbDomainName * sizeof(TCHAR));
   if(!pSID || !DomainName)
   {
    throw;
   }
   if(!LookupAccountName(NULL,
    AccountName,
    pSID,
    &cbSid,
    DomainName,
    &cbDomainName,
    &SIDNameUse))
   {
    throw;
   }
   bDone = TRUE;
  }
 }
 catch(...)
 {
  //nothing
 }

if(DomainName)
 {
  free(DomainName);
 }
  
 if(!bDone && pSID)
 {
  free(pSID);
 }
 if(bDone)
 {
  *Sid = pSID;
 }

return bDone;
}

服务中读取当前用户注册表HKEY_CURRENT_USER相关推荐

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

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

  2. system 权限读取注册表HKEY_CURRENT_USER

    注册表中 HKEY_CURRENT_USER 键下的内容隶属当前用户,所以当你以不同用户登陆时该键下的内容都是不尽相同的.但有时候我们有读取指定用户该键下内容的需求.比如,我们有一个服务程序运行在 S ...

  3. 随机从mysql中读取_如何实现MySQL表数据随机读取?从mysql表中读取随机数据

    文章转自 http://blog.efbase.org/2006/10/16/244/ 如何实现MySQL表数据随机读取?从mysql表中读取随机数据?以前在群里讨论过这个问题,比较的有意思.mysq ...

  4. SpringCloud(若依微服务版)读取Nacos中的配置以及多个服务共享Nacos配置的使用

    场景 若依微服务版手把手教你本地搭建环境并运行前后端项目: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/109363303 在上 ...

  5. HBase建表高级属性,hbase应用案例看行键设计,HBase和mapreduce结合,从Hbase中读取数据、分析,写入hdfs,从hdfs中读取数据写入Hbase,协处理器和二级索引

    1. Hbase高级应用 1.1建表高级属性 下面几个shell 命令在hbase操作中可以起到很到的作用,且主要体现在建表的过程中,看下面几个create 属性 1. BLOOMFILTER 默认是 ...

  6. 如何创建最简单的 ABAP 数据库表,以及编码从数据库表中读取数据 (上) 试读版

    ABAP 标准培训教程 BC400 学习笔记之一:ABAP 服务器的架构和一个典型的 ABAP 程序结构介绍 ABAP 标准培训教程 BC400 学习笔记之二:Cross-client 和 Clien ...

  7. 如何创建最简单的 ABAP 数据库表,以及编码从数据库表中读取数据 (下)

    在本文的前续篇章:如何创建最简单的 ABAP 数据库表,以及编码从数据库表中读取数据 (上) 我们已经在系统里创建了两张数据库表 ZPERSON 和 ZMYORDERS, 并插入了对应的记录: 文章的 ...

  8. 如何在golang http服务端程序中读取2次Request Body?(转)

    转自知乎:如何在golang http服务端程序中读取2次Request Body? - 知乎 提问: 在golang http服务端程序中,我想在真正处理Request Body之前将Body中的内 ...

  9. HKEY_CURRENT_USER下在服务中注册自启动exe

    在目录"计算机\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run"下写入test.exe 服务中注册一 ...

最新文章

  1. 基于张量分解和关系约束的多种类型的MicroRNA-疾病预测
  2. php微信墙开发,Node.js如何开发微信墙
  3. The Reflection And Amplification Attacks NTP Reply Flood Attack Based On NTP
  4. TypeError系列之:TypeError: 'tuple' object does not support item assignment
  5. 小师妹学JVM之:JIT中的PrintAssembly续集
  6. 一年级学情分析计算机,小学一年级语文学情分析范文
  7. 让我们在退烧中更清醒:谨慎投机性创业和投资的危害
  8. python bytes是什么类型,python中的字节串类型(bytes)
  9. Linux文件属性与管理
  10. js获取下月时间_JS获取上月,本月,下月的开始时间与结束时间
  11. 大数据之-Hadoop3.x_MapReduce_MapTask工作机制---大数据之hadoop3.x工作笔记0124
  12. [斯坦福]距离编码-更为强大的GNN
  13. struts2请求过程源代码分析
  14. java中文输出乱码_java汉字乱码解决办法
  15. RTL8152网卡灯配置详细说明
  16. 绘制自己的人际关系图_总算懂了如何画人际关系图
  17. 无法保存在此处,请选择其他位置
  18. 电荷耦合器件架构及工作原理
  19. css3中-moz、-ms、-webkit、-o 各是什么意思
  20. 博弈论中的MinMax搜索算法

热门文章

  1. dango One2Many example
  2. 世界杯ing~这不来个实时数据可视化?(结尾附源码)
  3. 紫装の槍使い(トゥーヴァ) / 紫枪(异时层土法)
  4. 用关键词搜索店铺列表详情
  5. 神经网络架构搜索——可微分搜索(DARTS)
  6. Realtime Multi-Person 2D Pose Estimation Using Part Affinity Fields【菜鸟读者】
  7. python最小二乘法_最小二乘法(least sqaure method)
  8. 编码格式问题 错误:JSON parse error: Invalid UTF-8 middle byte 0x3f
  9. 【卷积神经网络环境搭建学习笔记】
  10. redis常用命令总结,一文足以(5种基本数据结构+bitmap+Geo+HyperLogLog+Streams)