Многоуровневое использование олицетворения потоков - PullRequest
3 голосов
/ 27 января 2011

У меня есть некоторые проблемы с некоторыми давно написанными классами, которые выполняют олицетворение на уровне потоков и порождают процессы. Кажется, проблема в том, что мое использование этих служебных классов выходит за рамки того, что кто-то еще пытался с ними сделать.

Первый выполняет олицетворение на уровне потока, используя 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 - это ... не хорошее решение и не хороший дизайн.

1 Ответ

2 голосов
/ 28 января 2011

OpenThreadToken завершается ошибкой в ​​олицетворенном случае, поскольку олицетворенный пользователь не имеет разрешения на доступ к токену потока.Вы должны передать OpenAsSelf = TRUE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...