Если родительский процесс использовал 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.S. Пробовал как FALSE, так и TRUE в OpenThreadToken, без изменений.