线程什么时候获得它的相关访问令牌?

时间:2017-02-14 17:24:16

标签: c windows security

我的问题也可以说是“我为什么从调用OpenThreadToken获得ERROR_NO_TOKEN”?

错误的部分是:

hMainThread = OpenThread(THREAD_QUERY_INFORMATION, FALSE, threadID);

if (hMainThread == NULL)
{
    printf("Couldn't open thread. : %d\n", GetLastError());
    return -1;
}

if (!OpenThreadToken(hMainThread, TOKEN_READ, FALSE, &hMainThreadToken))
{
    printf("Couldn't open thread token: %d\n", GetLastError());
    return -1;
}

我得到第二个错误行1008.线程的所有者进程以runas /user:someoneelse

开头

我相信我理解假冒的错误。 runas不冒充?同样有趣的是,我在我的系统中的几个主要线程ID上尝试了这个代码,它适用于taskmgr.exe的主线程。所以代码可能没问题,因此Windows的行为让我们想到“如果你使用runas,你的主线程自动获取一个访问令牌集..对吗?“ - 这可能是唯一错误的地方。那么线程什么时候获得它的相关访问令牌?

1 个答案:

答案 0 :(得分:2)

RunAs不使用线程模拟,整个过程以指定用户身份运行。

当OpenThreadToken失败时,您通常会回到OpenProcessToken

有关线程可以模拟用户/客户端的方式,请参阅MSDN上的this topicImpersonateNamedPipeClient可能是最常用的功能,尤其是当服务需要冒充客户端时。