Имперсонация юзеров и привилегии

Тема в разделе "WASM.WIN32", создана пользователем redsh, 31 авг 2007.

  1. redsh

    redsh New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    20
    Всем привет. Почему после имперсонации юзера функция OpenProcessToken возвращает ошибку (GetLastError() == ERROR_ACCESS_DENIED)?

    Код (Text):
    1. #include <windows.h>
    2. #include <stdio.h>
    3.  
    4. LPTSTR szAdminLogin = "Admin";
    5. LPTSTR szAdminPass = "********";
    6. LPTSTR szDomain = ".";
    7. LPTSTR szNetName = "***.***.***.***";
    8. LPTSTR szMessage = "********";
    9.  
    10. int main(void)
    11. {
    12.     HANDLE hUserToken;
    13.     HANDLE hProcessToken;
    14.     TOKEN_PRIVILEGES *p_tkp;
    15.     p_tkp = (TOKEN_PRIVILEGES*)LocalAlloc(0, sizeof(DWORD) + sizeof(LUID_AND_ATTRIBUTES) * 2);
    16.     if( LogonUser(szAdminLogin, szDomain, szAdminPass, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, &hUserToken)) {
    17.         printf("LogonUser successful\n\n
    18.         ImpersonateLoggedOnUser(hUserToken);
    19.         if( OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hProcessToken) ) {
    20.             printf("OpenProcessToken succesful\n\n");    
    21.             p_tkp->PrivilegeCount = 2;
    22.             LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &(p_tkp->Privileges[0].Luid));
    23.             p_tkp->Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    24.             LookupPrivilegeValue(NULL, SE_REMOTE_SHUTDOWN_NAME, &(p_tkp->Privileges[1].Luid));
    25.             p_tkp->Privileges[1].Attributes = SE_PRIVILEGE_ENABLED;
    26.             AdjustTokenPrivileges(hProcessToken, FALSE, p_tkp, 0, NULL, 0);
    27.             InitiateSystemShutdown(szNetName, szMessage, 0, FALSE, TRUE);
    28.             CloseHandle(hProcessToken);
    29.         }
    30.         RevertToSelf();
    31.         CloseHandle(hUserToken);
    32.     }
    33.     LocalFree(p_tkp);
    34.     getchar();
    35.     return 0;
    36. }
     
  2. irrona

    irrona Member

    Публикаций:
    0
    Регистрация:
    26 май 2004
    Сообщения:
    178
    Адрес:
    Тирасполь
    redsh
    Где GetLastError()? Я его в твоем коде не вижу.
     
  3. redsh

    redsh New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    20
    Я отлаживал OllyDbg, он всегда показывает LastError.

    Вопрос стоит по другому - почему OpenProcessToken не работает после имперсонации?
     
    M0rg0t нравится это.
  4. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.576
    Кстати, столкнулся с аналогичной ошибкой. Почему такое может быть и что делать, кроме RevertToSelf?
     
  5. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
  6. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.576
    Thetrik, а что можно сделать в таком случае:
    программа запускается изначально с правами админа, есть привилегии, но нет доступа к некоторому ресурсу. Если сделать имперсонацию под токеном эксплорера - доступ появляется, но пропадают привилегии (в маркере эксплорера их нет). Привилегии скопировать нельзя, это я понял, но что можно сделать? Или ничего, только RevertToSelf? Читал в мсдн про linked токены (как в эксплорера админа при включенном юак), но как я понимаю, фиг что с ними можно сделать без прав.

    Т.е. можно как то "объединить" права доступа, доступные эксплореру, с привилегиями админа , или никак, только разные потоки/процессы?