如果父进程使用了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用户,而不是任何写入将被视为的用户!
我现在在OpenThreadToken的句柄上使用TokenUser
和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());
}
}
}
P.S WinSecurityInfo :: GetAccountSID只是LookupAccountSid的包装器 P.P.S在OpenThreadToken中尝试了FALSE和TRUE,没有变化
答案 0 :(得分:0)
您正在查看使用OpenThreadToken
检索到的线程令牌中的错误信息。要获取被模拟用户的身份,您需要查看TokenUser
,而不是TokenOwner
。
使用GetTokenInformation
检索用户。
然而,在面对模仿的过程中,不是花费很多精力去工作,更常见的做法是将API合同中的一部分指定为不合适。然后忽略这个问题。