Всем привет. Почему после имперсонации юзера функция OpenProcessToken возвращает ошибку (GetLastError() == ERROR_ACCESS_DENIED)? Код (Text): #include <windows.h> #include <stdio.h> LPTSTR szAdminLogin = "Admin"; LPTSTR szAdminPass = "********"; LPTSTR szDomain = "."; LPTSTR szNetName = "***.***.***.***"; LPTSTR szMessage = "********"; int main(void) { HANDLE hUserToken; HANDLE hProcessToken; TOKEN_PRIVILEGES *p_tkp; p_tkp = (TOKEN_PRIVILEGES*)LocalAlloc(0, sizeof(DWORD) + sizeof(LUID_AND_ATTRIBUTES) * 2); if( LogonUser(szAdminLogin, szDomain, szAdminPass, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, &hUserToken)) { printf("LogonUser successful\n\n ImpersonateLoggedOnUser(hUserToken); if( OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hProcessToken) ) { printf("OpenProcessToken succesful\n\n"); p_tkp->PrivilegeCount = 2; LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &(p_tkp->Privileges[0].Luid)); p_tkp->Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; LookupPrivilegeValue(NULL, SE_REMOTE_SHUTDOWN_NAME, &(p_tkp->Privileges[1].Luid)); p_tkp->Privileges[1].Attributes = SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges(hProcessToken, FALSE, p_tkp, 0, NULL, 0); InitiateSystemShutdown(szNetName, szMessage, 0, FALSE, TRUE); CloseHandle(hProcessToken); } RevertToSelf(); CloseHandle(hUserToken); } LocalFree(p_tkp); getchar(); return 0; }
Я отлаживал OllyDbg, он всегда показывает LastError. Вопрос стоит по другому - почему OpenProcessToken не работает после имперсонации?
Thetrik, а что можно сделать в таком случае: программа запускается изначально с правами админа, есть привилегии, но нет доступа к некоторому ресурсу. Если сделать имперсонацию под токеном эксплорера - доступ появляется, но пропадают привилегии (в маркере эксплорера их нет). Привилегии скопировать нельзя, это я понял, но что можно сделать? Или ничего, только RevertToSelf? Читал в мсдн про linked токены (как в эксплорера админа при включенном юак), но как я понимаю, фиг что с ними можно сделать без прав. Т.е. можно как то "объединить" права доступа, доступные эксплореру, с привилегиями админа , или никак, только разные потоки/процессы?