gpt4 book ai didi

c++ - 在多登录用户系统中检索当前登录的用户 SID

转载 作者:可可西里 更新时间:2023-11-01 10:45:24 24 4
gpt4 key购买 nike

我遇到一个问题,即用户 X(非管理员用户)运行提升的程序,在获取和查询与当前进程关联的 token 时检索到错误的 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 的 token ,但是当 2 个用户登录时我遇到了另一个问题,我如何区分正在运行的 explorer .exe 的实例?

编辑:如果我使用带有 UOI_USER_SID 的 GetUserObjectInformation 检索事件桌面的 SID,我得到长度为 20 的登录 session ,是否有可能以某种方式将此登录 session 转换为用户 session ?

最佳答案

WTS 函数自 Windows 2000 以来就已存在。

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

  1. 使用 WTSQuerySessionInformation() 查询当前 session 的 WTSUserName/WTSDomainNameWTSSessionInfo (它还提供域/用户),然后将这些值传递给 LookupAccountName() 以获取该用户的 SID。

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

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

关于c++ - 在多登录用户系统中检索当前登录的用户 SID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28668985/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com