一个独立的DLL如何找出令牌文件访问的内容?

时间:2014-04-07 16:06:09

标签: c++ winapi file-security

如果父进程使用了​​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

的评论/答案中的新问题

我现在在OpenThreadToken的句柄上使用TokenUserGetTokenInformation,但我再次获得启动用户但不是模拟用户

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在OpenThreadToken中尝试了FALSE和TRUE,没有变化

1 个答案:

答案 0 :(得分:0)

您正在查看使用OpenThreadToken检索到的线程令牌中的错误信息。要获取被模拟用户的身份,您需要查看TokenUser,而不是TokenOwner

使用GetTokenInformation检索用户。

然而,在面对模仿的过程中,不是花费很多精力去工作,更常见的做法是将API合同中的一部分指定为不合适。然后忽略这个问题。