system权限读取注册表HKEY_CURRENT_USER
注册表中 HKEY_CURRENT_USER 键下的内容⾪属当前⽤户,所以当你以不同⽤户登陆时该键下的内容都是不尽相同的。但有时候我们有读取指定⽤户该键下内容的需求。⽐如,我们有⼀个服务程序运⾏在 Session0, SYSTEM 权限,⽽我们想读取的却是当前登陆到本地控制台的⽤户的 IE 代理服务器设置参数。我们当然不能直接从服务中打开 HKEY_CURENT_USER 键,⽤我们当前令牌打开的是 SYSTEM 的 HKEY_CURRENT_USER 键,或许我们想可以通过当前线程扮演控制台⽤户来读取这个键
ImpersonateLoggedOnUser(hToken);
RegOpenKeyEx(HKEY_);
RevertToSelf();
其实这个⽅法也是不⾏的,因为虽然我们取得了控制台⽤户的令牌,并且模仿该⽤户,但因为在当前空间并没有装载该⽤户的环境变量,⽤户上下⽂,所以这⾥的 RegOpenKeyEx 调⽤还是失败的。
好在微软为我们准备了 LoadUserProfile();
⾸先我们可以⽤
WTSGetActiveConsoleSessionId 取得当前控制台会话的 id, 这个API xp/2003 以上才有,2000 没有怎么办?2000直接可以省却这⼀步了,因为 2000 不⽀持⽤户切换,所以本地控制台永远运⾏在 Session0.
然后你可以⽤ WTSQueryUserToken 获得指定 Session 已登陆⽤户令牌。这个API依然是 xp/2003 才⽀持, 2000 怎么办,⾃⼰想办法吧(是不是可以打开 的令牌看看 :) )。
然后 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;
session如何设置和读取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,
®KeyFrom);
//MessageBox(NULL, "Open spc key", "", NULL);
}
else
{
RegOpenKeyEx(HKEY_CURRENT_USER, IEPROXY_LOCALUSER_KEY, 0, KEY_QUERY_VALUE, ®KeyFrom); }
}
//MessageBox(NULL, "ImpersonateLoggedOnUser Successful", "atagtctl", NULL);
}
else
{
RegOpenKeyEx(HKEY_CURRENT_USER, IEPROXY_LOCALUSER_KEY, 0, KEY_QUERY_VALUE, ®KeyFrom);
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论