您的位置:首页 > 其它

system 权限读取注册表HKEY_CURRENT_USER

2014-06-03 13:56 1251 查看



注册表中 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, ®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);

}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: