Если родительский процесс использовал 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 вошедшего в систему процесса, а не на тот, под которым любые записи будут обрабатываться как!
Я сейчас пользуюсь 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, без изменений
Вы просматриваете неверную информацию в токене потока, полученном с OpenThreadToken
, Чтобы получить личность пользователя, выдавшего себя за вас, вам нужно взглянуть на TokenUser
, не TokenOwner
,
использование GetTokenInformation
чтобы получить пользователя.
Однако вместо того, чтобы идти на все, чтобы работать перед лицом подражания, более обычным является указание в рамках контракта API, что вы не делаете. А затем проигнорируйте проблему.
Других решений пока нет …