Убедитесь, что пользователь является администратором на локальном компьютере в C++ в Windows

Я пытаюсь найти решение или winapi, чтобы проверить, является ли имя пользователя администратором или нет на локальном компьютере.
Процесс выполняется под поставщиком учетных данных Windows, поэтому я считаю, что проверка текущего пользовательского потока не даст мне значение, которое я хотеть.

Обратите внимание, что я просмотрел другие ответы в StackOverflow, которые указывают на MSDN, который оценивает маркер доступа пользователя текущего потока.

У меня есть имя пользователя, для которого мне нужно найти информацию о доступе, есть ли у пользователя права доступа администратора на текущей машине.

Любые указатели или предложения приветствуются.


person Bit_Pulse    schedule 16.07.2017    source источник
comment
Что вы подразумеваете под Windows C++ API? Его нет, есть только C Windows API. Тегирование с помощью winapi вместо windows было бы более уместным, потому что это не имеет прямого отношения к ОС в целом.   -  person tambre    schedule 16.07.2017
comment
Я уже обновил вопрос на основе вашего предложения. Я не думаю, что отрицательный голос кому-либо поможет без объяснения причин.   -  person Bit_Pulse    schedule 16.07.2017
comment
У вас есть пароль, а также имя пользователя? Гораздо проще проверить наличие прав администратора, если вы можете сгенерировать токен, представляющий пользователя, но для этого требуется пароль. (Без пароля невозможно даже проверить наличие прав администратора в самом общем случае — если учетная запись находится в Active Directory, а не в локальной, у вас может не быть необходимого доступа для перечисления членства в группе.)   -  person Harry Johnston    schedule 16.07.2017
comment
@Bit_Pulse Я не минусовал. Я думаю, что неправильно так предполагать, поскольку отрицательный голос появился только при редактировании. Тем не менее, позор пользователю, который проголосовал против без причины (если причина не очевидна, что не является в данном случае)   -  person tambre    schedule 16.07.2017
comment
@HarryJohnston Да, у меня тоже есть пароль пользователя. и я использую LsaLogonuser для аутентификации. Этот API имеет выходной параметр PHANDLE Token Как вы думаете, я могу получить информацию о привилегиях пользователя из него?   -  person Bit_Pulse    schedule 16.07.2017
comment
да. Токен содержит всю необходимую информацию. Единственным усложняющим фактором является то, что система может сгенерировать разделенный токен; Я не уверен, происходит ли это внутри LsaLogonUser или на более высоком уровне. В любом случае, вы можете проверить токен на наличие группы администраторов, S-1-5-32-544 — если это разделенный токен, группа будет отключена, но она все равно будет присутствовать.   -  person Harry Johnston    schedule 16.07.2017
comment
Опубликуйте минимально воспроизводимый пример, чтобы продемонстрировать код, с которым у вас возникли проблемы.   -  person zett42    schedule 16.07.2017


Ответы (1)


Я не уверен, что он сделает то, что вы хотите, но NetUserGetInfo имеет поле, которое, по крайней мере, очень похоже на то, что вы, кажется, просите:

bool is_user_admin()
{
    bool result;
    DWORD rc;
    wchar_t user_name[256];
    USER_INFO_1 *info;
    DWORD size = sizeof( user_name );

    GetUserNameW( user_name, &size);

    rc = NetUserGetInfo( NULL, user_name, 1, (byte **) &info );
    if ( rc != NERR_Success )
        return false;

    result = info->usri1_priv == USER_PRIV_ADMIN;

    NetApiBufferFree( info );
    return result;
}

Также есть LsaEnumerateAccountRights, но (если мне не изменяет память) это показывает только права/привилегии, назначенные непосредственно рассматриваемой учетной записи, а не те, которые она получает через членство в группе и тому подобное (но это было довольно давно, и моя память далека от совершенства).

person Jerry Coffin    schedule 16.07.2017
comment
Спасибо, Джерри. Я попытаюсь использовать его в своем поставщике учетных данных Windows и обновлю его. - person Bit_Pulse; 16.07.2017
comment
Вместо использования магического размера 256 для массива вы должны использовать константу UNLEN (длина имени пользователя). - person tambre; 16.07.2017