Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Не удается программно предоставить привилегию с помощью AdjustTokenPrivileges

88K
10 декабря 2017 года
zastylow
3 / / 10.12.2017
Хочу программно предоставить привилегию текущему процессу с помощью AdjustTokenPrivileges. AdjustTokenPrivileges возвращает FALSE, а GetLastError() - ERROR_INVALID_HANDLE. Подобных примеров везде навалом, но у меня не работает. Может что-то добавить нужно или что-то не так делаю, или это в принципе невозможно? Подскажите, если кто-то разбирался с этим вопросом.
Код:
BOOL CRegEditDlg::SetPrivilege(CString privilege_name, BOOL bEnablePrivilege)
{
    CString s;
    HANDLE hToken;
    LUID luid;
    DWORD RetLen = 0;
    HANDLE hProcess;

    size_t sz = sizeof(TOKEN_PRIVILEGES);

    PTOKEN_PRIVILEGES pPriv = (PTOKEN_PRIVILEGES)_alloca(sz);
    PTOKEN_PRIVILEGES pOldPrivs = (PTOKEN_PRIVILEGES)_alloca(sz);

    hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, GetCurrentProcessId());

    try
    {
        OpenProcessToken(hProcess, TOKEN_QUERY || TOKEN_ADJUST_PRIVILEGES, &hToken);

        if (LookupPrivilegeValue(NULL, privilege_name, &luid))
        {
            pPriv->PrivilegeCount = 1;
            pPriv->Privileges[0].Luid = luid;

            if (bEnablePrivilege)
                pPriv->Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
            else
                pPriv->Privileges[0].Attributes = 0;

            if ( !AdjustTokenPrivileges(hToken,FALSE,pPriv,sz, pOldPrivs, &RetLen))
            {
                s.Format(L"AdjustTokenPrivileges error: %u", GetLastError() );
                AfxMessageBox(s);
                return FALSE;
            }
        }
    }
    catch (...)
    {
        try
        {
            CloseHandle(hToken);
        }
        catch (...)
        {
        }
    }

    return TRUE;
}
278
11 декабря 2017 года
Alexander92
1.1K / / 04.08.2008
А вы уверены, что ошибку возвращает именно AdjustTokenPrivileges? Чему равен GetLastError() после OpenProcess() и OpenProcessToken(), например? Я полагаю, что ошибка происходит еще оттуда.

P.S. Что заставило Вас в 2017-м году писать на MFC, если не секрет? :)
342
11 декабря 2017 года
Yos
209 / / 21.06.2003
Чем не устраивает OpenProcessToken(GetCurrentProcess(),...) ?

OpenProcessToken(hProcess, TOKEN_QUERY || - это что ?
pPriv->Privileges[0].Attributes = 0; - вы в этом уверены? документация что говорит по этому поводу?

Операция проходит замечательно и так:

AdjustTokenPrivileges(hToken,FALSE,pPriv,0, 0, 0);
88K
11 декабря 2017 года
zastylow
3 / / 10.12.2017
Спасибо за ответы. Заработало. Проблемы была в TOKEN_QUERY || TOKEN_ADJUST_PRIVILEGES, глаз замылился... На счет GetCurrentProcess: сначала использовал её, потом переделал на OpenProcess, в принципе не принципиально. В остальном всё нормально. Тема закрыта.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог