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 ユーザーではなく、ログオンしたプロセスの 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 の両方を試しましたが、変化はありませんでした

4

1 に答える 1