【发布时间】:2011-06-16 15:12:21
【问题描述】:
我对一些很久以前编写的执行线程级模拟和进程生成的类有一些问题。问题似乎是我对这些实用程序类的使用超出了其他人尝试使用它们的程度。
第一个使用 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
Spawning Process 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 处理返回它......不是一个好的解决方案,也不是好的设计。
【问题讨论】:
-
我不知道 IIS 在模拟方面是如何工作的(可能出于安全目的它做了一些奇怪的事情),但您可以尝试在进程上下文中打开令牌(通过将 TRUE 传递给 OpenThreadToken ) 或仅请求您实际需要的访问权限(而不是 TOKEN_ALL_ACCESS)。
-
我试图使用 TOKEN_ALL_ACCESS 以防需要的权限没有得到很好的记录。它实际上成功到第三个线程。也无法在进程的上下文中打开它 - 它没有使用我尝试生成的进程所需的权限(出于安全原因)。
标签: c++ windows security winapi impersonation