使用SetTokenInformation创建提升的令牌将返回错误87

时间:2018-07-18 20:35:27

标签: c++ windows winapi access-token elevation

我正在尝试使用SetTokenInformation创建一个提升的令牌,但是它失败了,并一直返回错误代码87。

这是我的代码:

#include <Windows.h>

int main()
{
    HANDLE currentProcessToken, newTok;
    OpenProcessToken(GetCurrentProcess(), TOKEN_DUPLICATE, &currentProcessToken);
    DuplicateTokenEx(currentProcessToken, TOKEN_ALL_ACCESS, nullptr, SecurityImpersonation, TokenPrimary, &newTok);
    CloseHandle(currentProcessToken);
    TOKEN_ELEVATION elev = { 1 };
    BOOL setTokenInfo = SetTokenInformation(newTok, TokenElevation, &elev, sizeof(TOKEN_ELEVATION));
    DWORD error = GetLastError(); // is 87 which is "the parameter is incorrect"
    return 0;
}

1 个答案:

答案 0 :(得分:2)

TokenElevation仅对GetTokenInformation功能有效。您可以查询的是TokenIsElevated,但无法设置。在这种情况下,NtSetInformationToken返回STATUS_INVALID_INFO_CLASSSetTokenInformation将此错误转换为ERROR_INVALID_PARAMETER。您可以通过调用NTSTATUS获得原始的RtlGetLastNtStatus()错误代码。而且无论如何您都不能“提升”现有的令牌。这是设计使然