2016-12-05 4 views
1

Для небольшой утилиты приложение, которое я пишу на работе, я следующий код, чтобы определить, является ли текущая учетная запись пользователя является локальным или администратором домена:Укажите, к какой группе (ов) принадлежит текущая учетная запись пользователя?

WCHAR wszUser[UNLEN]; 

    GetEnvironmentVariableW(L"username", wszUser, UNLEN); 

#ifndef _DEBUG 
    if (StrCmpIW(wszUser, L"Administrator") != 0) 
    { 
     MessageBoxW(0, L"This program can only be run as Administrator.", L"Error", MB_OK | MB_ICONSTOP); 
     return 0; 
    } 
#endif 

Это работает в нашем случае прямо сейчас, потому что:

  1. учетной запись администратора домена у нас является встроенным учетной записью администратора
  2. у нас нет никаких других учетных записей администратора домена.

Однако я понимаю, что это плохое решение, потому что в будущем мы могли бы добавить другие учетные записи администратора домена. Есть ли способ определить с помощью API Windows, является ли учетная запись пользователя, из которой выполняется процесс, принадлежит либо группе «Администраторы домена», либо BUILTIN\Administrators, или нет?

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

+2

Правильное решение в этом случае - использовать параметр компоновщика '/ MANIFESTUAC: level = requireAdministrator', или если у вас уже есть манифест, добавьте запись' requestExecutionLevel' с 'level =" requireAdministrator "' [ как описано здесь] (https://www.codeproject.com/articles/17968/making-your-application-uac-aware). –

+1

Если вам нужна информация о группе по какой-либо другой причине, посмотрите http://stackoverflow.com/questions/10450998/need-to-retrieve-all-groups-a-user-belongs-to-in-c. Но в этом случае я согласен с @HarryJohnston. – gnud

ответ

3

Правильным решением в этом случае является установка опции компоновщика /MANIFESTUAC:level=requireAdministrator или если у вас уже есть манифест, добавьте запись requestedExecutionLevelas described here.

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

Однако, если вы действительно хотите сделать это программно, see the documentation for the CheckTokenMembership function, в котором даже есть пример кода, который делает именно то, что вы просите. :-)

Смежные вопросы