Как отфильтровать специальные группы, возвращаемые GetTokenInformation()?

Я использую GetTokenInformation()/TokenGroups для получения групп, членом которых является пользователь, вошедший в систему. Однако список групп, возвращаемый из API, также включает специальные группы, такие как «ИНТЕРАКТИВНЫЙ», «ВХОД В КОНСОЛЬ», «Доступ, совместимый с версиями до Windows 2000» и т. д.

Каков наилучший способ отфильтровать специальные группы? В идеале я хотел бы сохранить только те группы, которые вы видите на вкладке «Член» диалогового окна свойств данного пользователя.

Спасибо.


person bdristan    schedule 06.09.2017    source источник
comment
для этого вам нужно сначала получить пользователя Sid из токена, затем вызвать LookupAccountSid для получения имени пользователя и, наконец, NetUserGetGroups   -  person RbMm    schedule 06.09.2017
comment
точнее NetUserGetLocalGroups   -  person RbMm    schedule 06.09.2017


Ответы (1)


Как было предложено в комментариях, NetUserGetLocalGroups скорее всего, это функция, используемая в оснастке «Локальные пользователи и группы».

Вы также можете отфильтровать список по любому критерию, который вы выберете:

static bool ShouldHideGroup(PSID Sid, DWORD Attributes, bool HideDeny = false)
{
    if (SE_GROUP_INTEGRITY & Attributes) return true;
    if (SE_GROUP_LOGON_ID & Attributes) return true;
    if (HideDeny && (SE_GROUP_USE_FOR_DENY_ONLY & Attributes)) return true;
    for (UINT i = 0; i <= 0xff; ++i) // Hack to check if it is well known
    {
        if (IsWellKnownSid(Sid, (WELL_KNOWN_SID_TYPE)i))
        {
            static const SID_IDENTIFIER_AUTHORITY ntauth = SECURITY_NT_AUTHORITY;
            PSID_IDENTIFIER_AUTHORITY pSIA = GetSidIdentifierAuthority(Sid);
            DWORD*pSub1 = GetSidSubAuthority(Sid, 0);
            if (memcmp(pSIA, &ntauth, 6) || *pSub1 != SECURITY_BUILTIN_DOMAIN_RID) // Hide everything except the BUILTIN\* groups
            {
                return true;
            }
        }
    }
    return false;
}

...
    if (GetTokenInformation(hToken, TokenGroups, pTG, cbTG, &cbTG))
    {
        for (DWORD i = 0; i < pTG->GroupCount; ++i)
        {
            if (ShouldHideGroup(pTG->Groups[i].Sid, pTG->Groups[i].Attributes)) continue;
            DisplayGroupDetails(pTG->Groups[i]);
        }
    }

Функции Net* работают с доменной и/или локальной базой данных SAM, остальные группы добавляются к вашему токену с помощью Windows, но я не верю, что существует общедоступный API для фильтрации обратного пути к точному списку групп из SAM.

person Anders    schedule 06.09.2017