在多个已登录用户系统中检索当前已登录的用户SID

每k

我面临一个问题,即非管理员用户X运行提升的程序,在获取和查询与当前进程关联的令牌时检索错误的SID信息。

我的主要限制是必须使用winXP兼容的代码,因此WSTx功能就不成问题了。

我尝试过的方法:

  1. 我尝试从交互式桌面/主窗口站中提取SID,但是这些产生奇怪的结果。
  2. 扩展的环境变量: %USERPROFILE%
  3. 用过的 GetUserName()

最后2个实际上检索了提升的用户。

我的代码:

HANDLE hTok = NULL;
            if (false == OpenProcessToken(/*hProcess*/GetCurrentProcess(), TOKEN_QUERY, &hTok))
            {
                LOG_ERROR(L"Failed obtaining process' token");
                return false;
            }

            // get user info size
            LPBYTE pBuf = nullptr;
            DWORD dwSize = 0;
            bool bSuccess = false;
            if (false == GetTokenInformation(hTok, TokenUser, NULL, 0, &dwSize))
            {
                if (ERROR_INSUFFICIENT_BUFFER != GetLastError())
                {
                    LOG_ERROR(L"Failed getting token information");
                    return false;
                }
            }

            do
            {
                pBuf = (BYTE*)::LocalAlloc(LPTR, dwSize);
                if (nullptr == pBuf)
                {
                    LOG_ERROR(L"Failed allocating buffer for token information");
                    break;
                }

                WCHAR* pSid = nullptr;
                if (GetTokenInformation(
                    hTok,
                    TokenUser,
                    pBuf,
                    dwSize,
                    &dwSize))
                {
                    PTOKEN_USER pUserToken = reinterpret_cast<PTOKEN_USER>(pBuf);
                    if (false == ConvertSidToString(pUserToken->User.Sid, &pSid))
                    {
                        LOG_ERROR(L"Failed converting sid to string");
                        break;
                    }

                    bSuccess = true;
                    ::LocalFree(pSid);
                }
            } while (false);

            if (pBuf)
                ::LocalFree(pBuf);

            if (hTok && INVALID_HANDLE_VALUE != hTok)
                ::CloseHandle(hTok);

            return bSuccess;

我想到的另一个想法是打开explorer.exe的令牌,但是当2个用户登录时遇到了另一个问题,现在如何区分正在运行的explorer.exes实例?

编辑:如果我使用带有UOI_USER_SID的GetUserObjectInformation检索Active Desktop的SID,则得到长度为20的登录会话,是否可以通过某种方式将此登录会话转换为用户会话?

雷米·勒博

自Windows 2000以来,WTS功能就已经存在。

我可以想到一些解决您问题的方法。您提升的流程可以:

  1. 用于WTSQuerySessionInformation()查询当前会话中的WTSUserName/WTSDomainNameWTSSessionInfo(也提供域/用户),然后将这些值传递LookupAccountName()给该用户的SID。

  2. 用于OpenDesktop()打开当前桌面,然后用于GetUserObjectInformation()查询UOI_USER_SID

  3. 创建一个在LocalSystem帐户中运行的单独服务,该服务WTSQueryUserToken()用于获取当前会话的用户令牌(您的应用可以将其当前SessionID传递给该服务,以便它知道要查询哪个会话),然后用于GetTokenInformation()查询其TokenLogonSid,并将SID传回到您的应用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

插入已登录用户的用户ID

来自分类Dev

已登录用户列表组

来自分类Dev

检查已登录用户的角色(PHP)

来自分类Dev

查找已登录用户的tty

来自分类Dev

已登录用户列表组

来自分类Dev

动态crm返回已登录用户的用户名

来自分类Dev

是否可以在已登录用户内创建用户

来自分类Dev

php检查用户当前是否已登录

来自分类Dev

在Treeline中,如何检查当前用户是否已登录?

来自分类Dev

检测已登录用户是否以未登录用户身份访问过页面

来自分类Dev

使用android中的SQLite检索当前登录用户的用户名

来自分类Dev

如何访问Struts2中已登录用户的用户名?

来自分类Dev

如何在Flutter中显示除已登录用户外的Firebase用户列表?

来自分类Dev

如何在Django的模型字段中添加已登录用户的用户名

来自分类Dev

如何获取Django中已登录用户的用户名?

来自分类Dev

跟踪已登录的用户

来自分类Dev

仅对已登录用户的视频进行身份验证

来自分类Dev

Firebase仅允许已登录用户写入

来自分类Dev

Django表单:仅显示已登录用户的许多对象

来自分类Dev

如何配置@PreAuthorize识别已登录用户的ID?

来自分类Dev

MS Graph:如何确定已登录用户的帐户类型?

来自分类Dev

查找已登录用户的docker速率限制

来自分类Dev

已登录用户的AJAX调整div宽度

来自分类Dev

显示连接到已登录用户的数据

来自分类Dev

如何查看已登录用户的其他信息?

来自分类Dev

如何查询所有已登录用户的CAS?

来自分类Dev

如何正确导出已登录用户的名称?

来自分类Dev

仅对已登录用户的视频进行身份验证

来自分类Dev

跟踪已登录用户的Cookie存在-Wordpress

Related 相关文章

热门标签

归档