Как проверить, есть ли у процесса административные права - PullRequest
20 голосов
/ 08 ноября 2011

Как правильно проверить, запущен ли процесс с правами администратора?

Я проверил функцию IsUserAnAdim в MSDN , но это не рекомендуется, поскольку она может быть изменена или недоступна в последующих версиях Windows. Вместо этого рекомендуется использовать функцию CheckTokenMembership.

Затем я посмотрел на альтернативный пример в MSDN из описания функции CheckTokenMembership. Однако в MSDN есть комментарий Стефана Озминского, в котором говорится, что этот пример не работает должным образом в Windows Vista, если UAC отключен.

Наконец, я попытался использовать код Стефана Озмински из MSDN, но он определяет, что у процесса есть права администратора, даже если я запускаю его под обычным пользователем без прав администратора в Windows 7.

Ответы [ 2 ]

45 голосов
/ 19 ноября 2011

Это скажет вам, если вы работаете с повышенными привилегиями или нет. Вы можете настроить манифест на запуск с максимально возможным, если хотите, чтобы он подсказал. Есть и другие способы запрашивать у окон через код альтернативные учетные данные.

BOOL IsElevated( ) {
    BOOL fRet = FALSE;
    HANDLE hToken = NULL;
    if( OpenProcessToken( GetCurrentProcess( ),TOKEN_QUERY,&hToken ) ) {
        TOKEN_ELEVATION Elevation;
        DWORD cbSize = sizeof( TOKEN_ELEVATION );
        if( GetTokenInformation( hToken, TokenElevation, &Elevation, sizeof( Elevation ), &cbSize ) ) {
            fRet = Elevation.TokenIsElevated;
        }
    }
    if( hToken ) {
        CloseHandle( hToken );
    }
    return fRet;
}
0 голосов
/ 15 мая 2018

Вы можете использовать функцию LsaOpenPolicy().Функция LsaOpenPolicy открывает дескриптор объекта Policy в локальной или удаленной системе.

Вы должны запустить процесс «Как администратор», чтобы вызов не завершился ошибкой с ERROR_ACCESS_DENIED.

Источник: MSDN

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