У меня возникла проблема, когда пользователь X, который является пользователем, не являющимся администратором, запускает повышенную программу, извлекает неверную информацию SID при извлечении и запросе токена связанных с текущим процессом.Получение зарегистрированного пользователя SID в многопользовательской системе пользователей
Мое основное ограничение здесь заключается в том, что я должен использовать winXP
совместимый код, поэтому WSTx
функций не может быть и речи.
Методы Я попытался:
- Я попытался извлечения SID с интерактивного рабочего стола/главного окна станции, но эти выход нечетные результаты.
- Expanded Env переменные:
%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
«s маркер, но я столкнулся с другой проблемой, когда 2 пользователи вошли в систему, как я могу различать между запущенными explorer.exe
с сейчас?
Edit: Если я получить SID с помощью GetUserObjectInformation активного рабочего стола с UOI_USER_SID, я получаю сеанс входа в систему, которая 20 в длину, можно ли каким-то образом перевести этот сеанс входа в систему в сеансе пользователя?
Функции WTS были вокруг с Windows 2000, на самом деле. Попробуйте использовать 'WTSQuerySessionInformation()' для запроса 'WTSUserName' и' WTSDomainName', затем передайте эти значения 'LookupAccountName()' для получения SID. –