Приложение использует имперсонацию для получения определённых привелегий. Но есть момент который мне не очень понятен. Если выполнить SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS); до ImpersonateLoggedOnUser(g_hToken); то всё нормально, а если наоборот, то не получается установить REALTIME_PRIORITY_CLASS. Имперсоная происходит на юзера из группы "Администраторы", перед этим включается привелегия SeIncreaseBasePriorityPrivilege для юзера на которого переключаюсь. Система XP+SP2. Почему так ?
А имперсонацию ты производишь в главном потоке? Если да, то лучше кинь приложение, посмотрим. Имперсоная происходит на юзера из группы "Администраторы", перед этим включается привелегия SeIncreaseBasePriorityPrivilege для юзера на которого переключаюсь. Не понял как ты можешь активировать привилегию для пользователя, на которого ещё не имперсонировался. Попробуй в отладчике посмотри GetLastError. Для этой цели удобнее будет OllyDbg.
имперсонация происходит в главном потоке Код (Text): HANDLE g_hToken = NULL; ... if(!LogonUser("user", NULL, "password", LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, &g_hToken)) { DWORD dwError = GetLastError(); MessageBox(NULL, "LogonUser error", "Ошибка", MB_OK | MB_ICONSTOP | MB_TOPMOST); return FALSE; } // ModifyPrivilege в зависимости от второго параметра (TRUE/FALSE)включает/выключат привилегию для g_hToken if(ModifyPrivilege("SeBackupPrivilege", TRUE) != ERROR_SUCCESS) { MessageBox(NULL, "ModifyPrivilege(SeBackupPrivilege)", "Внимание", MB_OK | MB_ICONWARNING | MB_TOPMOST); return FALSE; } if(ModifyPrivilege("SeRestorePrivilege", TRUE) != ERROR_SUCCESS) { MessageBox(NULL, "ModifyPrivilege(SeRestorePrivilege)", "Внимание", MB_OK | MB_ICONWARNING | MB_TOPMOST); return FALSE; } if(ModifyPrivilege("SeSystemtimePrivilege", TRUE) != ERROR_SUCCESS) { MessageBox(NULL, "ModifyPrivilege(SeSystemtimePrivilege)", "Внимание", MB_OK | MB_ICONWARNING | MB_TOPMOST); return FALSE; } if(ModifyPrivilege("SeIncreaseBasePriorityPrivilege", TRUE) != ERROR_SUCCESS) { MessageBox(NULL, "ModifyPrivilege(SeIncreaseBasePriorityPrivilege)", "Внимание", MB_OK | MB_ICONWARNING | MB_TOPMOST); return FALSE; } if(!ImpersonateLoggedOnUser(g_hToken)) { MessageBox(NULL, "ImpersonateLoggedOnUser error", "Ошибка", MB_OK | MB_ICONSTOP | MB_TOPMOST); return FALSE; } Насчёт GetLastError... так никакого error-а и нет... Система не даёт выставить приоритет выше ABOVE_NORMAL_PRIORITY_CLASS. Если попробую выставить REALTIME_PRIORITY_CLASS, то всё пройдёт без ошибок, но GetPriorityClass вернёт ABOVE_NORMAL_PRIORITY_CLASS;
Попутался я... HIGH_PRIORITY_CLASS как раз можно... Если точнее, то можно выставить все, кроме REALTIME_PRIORITY_CLASS. Из под taskmgr'a можно любой.
Нашёл что-нить? Уже который день пытаюсь найти проблему, но не получается. Может задать вопрос самой microsoft?