Как независимая 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());
        }
    }
}

PS WinSecurityInfo::GetAccountSID - это просто оболочка вокруг LookupAccountSid PPS. Испытывает FALSE и TRUE в OpenThreadToken, без изменений.

1 ответ

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

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

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

Другие вопросы по тегам