服务中读取当前用户注册表HKEY_CURRENT_USER
服务 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相关推荐
- windows下服务或SYSTEM权限读取当前用户注册表HKEY_CURRENT_USER
最近一直在给一个程序增加一个功能,需要修改注册表 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MountP ...
- system 权限读取注册表HKEY_CURRENT_USER
注册表中 HKEY_CURRENT_USER 键下的内容隶属当前用户,所以当你以不同用户登陆时该键下的内容都是不尽相同的.但有时候我们有读取指定用户该键下内容的需求.比如,我们有一个服务程序运行在 S ...
- 随机从mysql中读取_如何实现MySQL表数据随机读取?从mysql表中读取随机数据
文章转自 http://blog.efbase.org/2006/10/16/244/ 如何实现MySQL表数据随机读取?从mysql表中读取随机数据?以前在群里讨论过这个问题,比较的有意思.mysq ...
- SpringCloud(若依微服务版)读取Nacos中的配置以及多个服务共享Nacos配置的使用
场景 若依微服务版手把手教你本地搭建环境并运行前后端项目: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/109363303 在上 ...
- HBase建表高级属性,hbase应用案例看行键设计,HBase和mapreduce结合,从Hbase中读取数据、分析,写入hdfs,从hdfs中读取数据写入Hbase,协处理器和二级索引
1. Hbase高级应用 1.1建表高级属性 下面几个shell 命令在hbase操作中可以起到很到的作用,且主要体现在建表的过程中,看下面几个create 属性 1. BLOOMFILTER 默认是 ...
- 如何创建最简单的 ABAP 数据库表,以及编码从数据库表中读取数据 (上) 试读版
ABAP 标准培训教程 BC400 学习笔记之一:ABAP 服务器的架构和一个典型的 ABAP 程序结构介绍 ABAP 标准培训教程 BC400 学习笔记之二:Cross-client 和 Clien ...
- 如何创建最简单的 ABAP 数据库表,以及编码从数据库表中读取数据 (下)
在本文的前续篇章:如何创建最简单的 ABAP 数据库表,以及编码从数据库表中读取数据 (上) 我们已经在系统里创建了两张数据库表 ZPERSON 和 ZMYORDERS, 并插入了对应的记录: 文章的 ...
- 如何在golang http服务端程序中读取2次Request Body?(转)
转自知乎:如何在golang http服务端程序中读取2次Request Body? - 知乎 提问: 在golang http服务端程序中,我想在真正处理Request Body之前将Body中的内 ...
- HKEY_CURRENT_USER下在服务中注册自启动exe
在目录"计算机\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run"下写入test.exe 服务中注册一 ...
最新文章
- 基于张量分解和关系约束的多种类型的MicroRNA-疾病预测
- php微信墙开发,Node.js如何开发微信墙
- The Reflection And Amplification Attacks NTP Reply Flood Attack Based On NTP
- TypeError系列之:TypeError: 'tuple' object does not support item assignment
- 小师妹学JVM之:JIT中的PrintAssembly续集
- 一年级学情分析计算机,小学一年级语文学情分析范文
- 让我们在退烧中更清醒:谨慎投机性创业和投资的危害
- python bytes是什么类型,python中的字节串类型(bytes)
- Linux文件属性与管理
- js获取下月时间_JS获取上月,本月,下月的开始时间与结束时间
- 大数据之-Hadoop3.x_MapReduce_MapTask工作机制---大数据之hadoop3.x工作笔记0124
- [斯坦福]距离编码-更为强大的GNN
- struts2请求过程源代码分析
- java中文输出乱码_java汉字乱码解决办法
- RTL8152网卡灯配置详细说明
- 绘制自己的人际关系图_总算懂了如何画人际关系图
- 无法保存在此处,请选择其他位置
- 电荷耦合器件架构及工作原理
- css3中-moz、-ms、-webkit、-o 各是什么意思
- 博弈论中的MinMax搜索算法
热门文章
- dango One2Many example
- 世界杯ing~这不来个实时数据可视化?(结尾附源码)
- 紫装の槍使い(トゥーヴァ) / 紫枪(异时层土法)
- 用关键词搜索店铺列表详情
- 神经网络架构搜索——可微分搜索(DARTS)
- Realtime Multi-Person 2D Pose Estimation Using Part Affinity Fields【菜鸟读者】
- python最小二乘法_最小二乘法(least sqaure method)
- 编码格式问题 错误:JSON parse error: Invalid UTF-8 middle byte 0x3f
- 【卷积神经网络环境搭建学习笔记】
- redis常用命令总结,一文足以(5种基本数据结构+bitmap+Geo+HyperLogLog+Streams)