Как независимая DLL может узнать, с какими файлами Token будет осуществляться доступ?

Если родительский процесс использовал LogonUser так, чтобы токен доступа, используемый для доступа к файлу, отличался от токена, с которого был запущен процесс, как DLL может узнать имя пользователя NT, под которым будет обрабатываться доступ к файлу?

Если бы у меня было определенное местоположение файла, то я мог бы использовать GetFileSecurityОднако я не знаю каких-либо гарантированных доступных путей в контексте DLL.

Если бы я использовал следующее:

PSID ownedSID(NULL);
SECURITY_INFORMATION siRequested = OWNER_SECURITY_INFORMATION;
wSecInfoOK = GetSecurityInfo(GetCurrentProcess(), SE_KERNEL_OBJECT, siRequested, &ownedSID, NULL, NULL, NULL, NULL);

затем возвращенный PSID ссылается на пользователя Windows вошедшего в систему процесса, а не на тот, под которым любые записи будут обрабатываться как!

Новый вопрос в свете комментария / ответа от @arx

Я сейчас пользуюсь TokenUser с GetTokenInformation на дескрипторе от OpenThreadToken, но снова я получаю запускающего пользователя, но не олицетворенного пользователя

HANDLE hThreadToken = NULL;
if (OpenThreadToken(GetCurrentThread(), TOKEN_ALL_ACCESS, TRUE, &hThreadToken))
{
// success

CHeapPtr<TOKEN_USER, CGlobalAllocator> pToken;
DWORD length = 0U, dwError(0UL);
if (!GetTokenInformation(hThreadToken, TokenUser, NULL, 0, &length) && ERROR_INSUFFICIENT_BUFFER == GetLastError())
{
pToken.AllocateBytes(length);
SetLastError(ERROR_SUCCESS);//Reset last error - we have now allocated the required memory so the buffer is now big enough i.e GetLastError() != ERROR_INSUFFICIENT_BUFFER
if (pToken && GetTokenInformation(hThreadToken, TokenUser, pToken, length, &length))
{
if (IsValidSid(pToken->User.Sid))
sFailedUser = WinSecurityInfo::GetAccountSID(pToken->User.Sid, dwError);
}
dwError = GetLastError();
if (dwError)
{
boost::system::error_code sidError = MakeSysError(dwError);
TRACE("Error text for GetLastError() = '%s'\n", sidError.message().c_str());
}
}
}

P.S WinSecurityInfo :: GetAccountSID — это просто оболочка вокруг LookupAccountSid
P.P.S Пробовал и FALSE, и TRUE в OpenThreadToken, без изменений

0

Решение

Вы просматриваете неверную информацию в токене потока, полученном с OpenThreadToken, Чтобы получить личность пользователя, выдавшего себя за вас, вам нужно взглянуть на TokenUser, не TokenOwner,

использование GetTokenInformation чтобы получить пользователя.

Однако вместо того, чтобы идти на все, чтобы работать перед лицом подражания, более обычным является указание в рамках контракта API, что вы не делаете. А затем проигнорируйте проблему.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]