如何读取指定用户的 HKEY_CURRENT_USER 注册表键收藏

 

 如何读取指定用户的 HKEY_CURRENT_USER 注册表键收藏

新一篇: Windows Vista 之启动一二 | 旧一篇: 将窗口移动到前端, BringWindowToTop() 的问题

<script></script>

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

有效代码:

    HANDLE hToken = NULL;
    BOOL bImpersonated = FALSE;
    PROFILEINFOA cuProfileInfo;
    TCHAR szUsername[MAX_PATH];
    DWORD dwUsernameLen = MAX_PATH;
    DWORD seesionid = WTSGetActiveConsoleSessionId();
    if(WTSQueryUserToken(seesionid,&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(LoadUserProfile(hToken, &cuProfileInfo))
        {
            LONG lRet = RegOpenKeyEx((struct HKEY__ *)cuProfileInfo.hProfile,
                "software//microsoft//Windows//CurrentVersion//Internet Settings",
                0, KEY_ALL_ACCESS, &hKey);
            //MessageBox(NULL, "Open spc key", "", NULL);
            if(lRet==ERROR_SUCCESS)
            {
                DWORD dwLen=255;
                RegQueryValueEx(hKey,"ProxyServer",NULL,NULL,(unsigned char*)szTmp,&dwLen);
                if(szTmp[0]!=0)
                    bExist=TRUE;
               
                DWORD dwLen1=4;
                RegQueryValueEx(hKey,"ProxyEnable",NULL,NULL,(unsigned char*)&bEnable,&dwLen1);
               
                RegCloseKey(hKey);
               
               
                if(dwLen>0 && szTmp[0]!=0)
                {
                    char *p=NULL;
                    char szIpPort[64];
                    ZeroMemory(szIpPort,64);
                    if((p=StrStr(szTmp,";")))
                    {
                        *p='/0';
                        p=StrChrA(szTmp,'=');
                        if(p){
                            p++;
                            lstrcpy(szIpPort,p);
                        }
                    }
                    else
                        lstrcpyn(szIpPort,szTmp,64);
                   
                    for(int i=0;i<64;i++)
                    {
                        if(szIpPort[i]== 0X3A)  //':'
                        {
                            szIpPort[i]='/0';
                            lstrcpy(lpProxyIp,szIpPort);
                            usProxyPort=StrToInt(&szIpPort[i+1]);
                            return TRUE;
                        }
                    }
                }
            }
        }
        else
        {
            LONG lRet = RegOpenKeyEx(HKEY_CURRENT_USER,
                "software//microsoft//Windows//CurrentVersion//Internet Settings",
                0,
                KEY_ALL_ACCESS,
                &hKey);
            if(lRet==ERROR_SUCCESS)
            {
                DWORD dwLen=255;
                RegQueryValueEx(hKey,"ProxyServer",NULL,NULL,(unsigned char*)szTmp,&dwLen);
                if(szTmp[0]!=0)
                    bExist=TRUE;
               
                DWORD dwLen1=4;
                RegQueryValueEx(hKey,"ProxyEnable",NULL,NULL,(unsigned char*)&bEnable,&dwLen1);
               
                RegCloseKey(hKey);
               
               
                if(dwLen>0 && szTmp[0]!=0)
                {
                    char *p=NULL;
                    char szIpPort[64];
                    ZeroMemory(szIpPort,64);
                    if((p=StrStr(szTmp,";")))
                    {
                        *p='/0';
                        p=StrChrA(szTmp,'=');
                        if(p){
                            p++;
                            lstrcpy(szIpPort,p);
                        }
                    }
                    else
                        lstrcpyn(szIpPort,szTmp,64);
                   
                    for(int i=0;i<64;i++)
                    {
                        if(szIpPort[i]== 0X3A)  //':'
                        {
                            szIpPort[i]='/0';
                            lstrcpy(lpProxyIp,szIpPort);
                            usProxyPort=StrToInt(&szIpPort[i+1]);
                            return TRUE;
                        }
                    }
                }
            }
        }
        //MessageBox(NULL, "ImpersonateLoggedOnUser Successful", "atagtctl", NULL);
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值