0

如果父进程使用了​​ 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 的句柄上使用TokenUserwith ,但我再次获得了启动用户而不是模拟用户GetTokenInformation

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

4

1 回答 1

0

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

用于GetTokenInformation检索用户。

然而,与其在模拟面前竭尽全力工作,更常见的做法是在您的 API 合同中指定您没有指定的部分。然后忽略这个问题。

于 2014-04-08T13:10:04.587 回答