[英]Multilevel usage of thread impersonation
我在一些很久以前编写的类中遇到了一些问题,这些类会进行线程级模拟和进程生成。 问题似乎是我对这些实用程序类的使用超出了其他人尝试使用它们的范围。
第一个是使用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失败,错误代码为5,来自OpenThreadToken。 如果我从线程1生成进程1,OpenThreadToken不会给我任何guff。 我从OpenThreadToken和DuplicateToken请求TOKEN_ACCESS_ALL,直到我从Thread 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回到它的句柄是......不是一个好的解决方案而不是好的设计。
在模拟的情况下,OpenThreadToken失败,因为模拟的用户没有访问该线程令牌的权限。 你应该传递OpenAsSelf = TRUE。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.