使用 win32api 确定令牌是主要令牌还是模拟令牌?

Determining whether a token is primary or impersonation using win32api?

假设我可以处理以下代码

pid = 1234
pHandle = win32api.OpenProcess(win32con.MAXIMUM_ALLOWED,pywintypes.FALSE,pid)
tHandle = win32security.OpenProcessToken(pHandle,win32con.MAXIMUM_ALLOWED)

我如何确定进程令牌是主要令牌还是模拟令牌?

进程令牌始终是主要令牌。所以这里没有什么可以确定的。线程令牌始终(如果存在)模拟令牌。所以当你打开进程或线程令牌时 - 你已经知道它的类型。所有 api 其中 return 令牌 - return 从开始令牌类型已知。唯一的情况是,当您需要确定令牌类型(未知)时 - 您枚举进程句柄并尝试检查令牌句柄。 为此,您需要使用 GetTokenInformation with TokenType,但实际上这种情况很少见,您可能会需要它。仅适用于某些调试实用程序。

c/c++

上的演示代码
ULONG GetTokenType(_In_ HANDLE hToken, _Out_ PTOKEN_TYPE ptp)
{
    ULONG cb;
    return GetTokenInformation(hToken, ::TokenType, ptp, 
        sizeof(TOKEN_TYPE), &cb) ? NOERROR : GetLastError();
}

void DemT()
{
    HANDLE hToken;
    if (OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken))
    {
        TOKEN_TYPE tp;
        // we already know that token is primary
        if (GetTokenType(hToken, &tp) != NOERROR || tp != TokenPrimary)
        {
            __debugbreak();
        }
        
        CloseHandle(hToken);

        if (0 <= NtImpersonateAnonymousToken(GetCurrentThread()))
        {
            if (OpenThreadToken(GetCurrentThread(), TOKEN_QUERY, TRUE, &hToken))
            {
                // we already know that token is impersonating
                if (GetTokenType(hToken, &tp) != NOERROR || tp != TokenImpersonation)
                {
                    __debugbreak();
                }

                CloseHandle(hToken);
            }

            SetThreadToken(0, 0);
        }
    }
}