Как проверить, является ли указанный пользователь администратором на локальном компьютере или нет? - PullRequest
1 голос
/ 03 сентября 2011

Я хочу знать, является ли пользователь администратором на ПК или нет?Я нашел фрагмент кода, который делает это, но у меня есть проблема с ним.Проблема с этим кодом заключается в том, что эта функция вернется, если пользователь, запустивший процесс, имеет права администратора или нет.Но я хочу спросить, есть ли у конкретного пользователя права администратора или нет.Могу ли я сделать это как-нибудь?Это важно, потому что мое приложение будет работать под учетной записью SYSTEM, поэтому оно всегда будет возвращать, что пользователь является администратором, но я хочу знать, является ли вошедший в систему пользователь администратором или нет?

Фрагмент кода:

BOOL IsUserAdmin( VOID )
/*++ 
Routine Description: This routine returns TRUE if the caller's
process is a member of the Administrators local group. Caller is NOT
expected to be impersonating anyone and is expected to be able to
open its own process and process token. 
Arguments: None. 
Return Value: 
  TRUE - Caller has Administrators local group. 
  FALSE - Caller does not have Administrators local group. --
*/ 
{
BOOL b;
SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY;
PSID AdministratorsGroup; 

b = AllocateAndInitializeSid(
                                &NtAuthority,
                                2,
                                SECURITY_BUILTIN_DOMAIN_RID,
                                DOMAIN_ALIAS_RID_ADMINS,
                                0, 0, 0, 0, 0, 0,
                                &AdministratorsGroup
                            ); 
if ( b ) 
{
    if ( !CheckTokenMembership( NULL, AdministratorsGroup, &b ) ) 
    {
        b = FALSE;
    } 
    FreeSid( AdministratorsGroup ); 
}

return ( b );
}

Ответы [ 3 ]

2 голосов
/ 03 сентября 2011

Вам необходимо выполнить следующие шаги.

  1. Решите, какого вошедшего в систему пользователя вы хотите выбрать, может быть более одного. Я бы идентифицировал их, используя процесс, например, процесс проводника.
  2. Звоните OpenProcessToken(), передавая дескриптор процесса. Убедитесь, что вы указали TOKEN_DUPLICATE.
  3. Позвоните DuplicateToken(), чтобы получить жетон подражания.
  4. Вызовите CheckTokenMembership(), как и раньше, но передавая токен, а не NULL.
  5. Уберись!
1 голос
/ 03 сентября 2011
  1. Запустите ваш пользовательский интерфейс в рамках зарегистрированной учетной записи. Это защищает привилегированную службу от разрушительных атак.

  2. Используйте DCOM для пересылки запросов из графического интерфейса в привилегированную службу. Используйте олицетворение в привилегированной службе для обнаружения прав пользователя.

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