我的问题也可以说是“我为什么从调用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,你的主线程自动获取一个访问令牌集..对吗?“ - 这可能是唯一错误的地方。那么线程什么时候获得它的相关访问令牌?
答案 0 :(得分:2)
RunAs不使用线程模拟,整个过程以指定用户身份运行。
当OpenThreadToken失败时,您通常会回到OpenProcessToken
。
有关线程可以模拟用户/客户端的方式,请参阅MSDN上的this topic。 ImpersonateNamedPipeClient
可能是最常用的功能,尤其是当服务需要冒充客户端时。