我面临一个问题,即非管理员用户X运行提升的程序,在获取和查询与当前进程关联的令牌时检索错误的SID信息。
我的主要限制是必须使用winXP
兼容的代码,因此WSTx
功能就不成问题了。
我尝试过的方法:
%USERPROFILE%
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.exe
s实例?
编辑:如果我使用带有UOI_USER_SID的GetUserObjectInformation检索Active Desktop的SID,则得到长度为20的登录会话,是否可以通过某种方式将此登录会话转换为用户会话?
自Windows 2000以来,WTS功能就已经存在。
我可以想到一些解决您问题的方法。您提升的流程可以:
用于WTSQuerySessionInformation()
查询当前会话中的WTSUserName
/WTSDomainName
或WTSSessionInfo
(也提供域/用户),然后将这些值传递LookupAccountName()
给该用户的SID。
用于OpenDesktop()
打开当前桌面,然后用于GetUserObjectInformation()
查询UOI_USER_SID
。
创建一个在LocalSystem帐户中运行的单独服务,该服务WTSQueryUserToken()
用于获取当前会话的用户令牌(您的应用可以将其当前SessionID传递给该服务,以便它知道要查询哪个会话),然后用于GetTokenInformation()
查询其TokenLogonSid
,并将SID传回到您的应用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句