У меня есть некоторые проблемы с некоторыми давно написанными классами, которые выполняют олицетворение на уровне потоков и порождают процессы. Кажется, проблема в том, что мое использование этих служебных классов выходит за рамки того, что кто-то еще пытался с ними сделать.
Первый выполняет олицетворение на уровне потока, используя 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 не дает мне никакой болтовни. Я запрашиваю TOKEN_ACCESS_ALL у OpenThreadToken & DuplicateToken, и он не завершится ошибкой, пока я не сделаю это из потока 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 - это ... не хорошее решение и не хороший дизайн.