親プロセスが 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 ユーザーではなく、ログオンしたプロセスの Windows ユーザーを参照します。
軽いコメントの新しい質問/ @arxからの回答
現在、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());
}
}
}
PS WinSecurityInfo::GetAccountSID は単なる LookupAccountSid のラッパー PPS OpenThreadToken で FALSE と TRUE の両方を試しましたが、変化はありませんでした