我对一些很久以前编写的进行线程级模拟和进程生成的类遇到了一些问题。问题似乎是我对这些实用程序类的使用超出了其他人尝试使用它们所做的事情。
第一个通过使用 OpenThreadToken 和 DuplicateToken 以及 ImpersonateLoggedOnUser 进行线程级模拟。
第二个尝试使用 CreateProcessAsUser 以及通过 OpenThreadToken / DuplicateToken 获得的令牌来创建进程。
我遇到的问题是:
Thread 1 running in IIS with the correct user
Thread 2 that is created by Thread 1 - which is impersonated
Thread 3 that is created by Thread 2 - which is impersonated
Process 1 that is spawned by Thread 3 - which I attempt to impersonate
生成进程 1 失败,来自 OpenThreadToken 的错误代码为 5。如果我从线程 1 生成进程 1,OpenThreadToken 不会给我任何废话。我从 OpenThreadToken 和 DuplicateToken 请求 TOKEN_ACCESS_ALL,直到我实际从线程 3 执行此操作时它才会失败。有人知道我在这里可能实际需要哪些权限吗?
这是生成进程的代码:
(模拟线程只涉及获取线程令牌句柄并调用 ImpersonateLoggedOnUser...)
//process spawn
if (!::OpenThreadToken(::GetCurrentThread(),
TOKEN_ALL_ACCESS,
false,
&hThreadUserToken))
{
Handle hNewProcessUserToken;
if (!DuplicateTokenEx(
hThreadUserToken,
TOKEN_ALL_ACCESS,
NULL,
SecurityDelegation,
TokenPrimary ,
&hNewProcessUserToken))
{
m_dwCreateError = ::GetLastError();
return false;
}
bReturnValue = ::CreateProcessAsUserA(
hNewProcessUserToken,
AppName,
cmdLine,
NULL,
NULL,
TRUE,
0,
m_lpEnvironment,
cwdStr
&m_StartupInfo,
&piProcInfo);
我在这里做错了什么明显的事情吗?我无法真正从线程 1 中生成进程 - 它只是没有所需的正确信息,并且从线程 3 中返回它的句柄......不是一个好的解决方案,也不是一个好的设计。