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

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

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

Благодарю.

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 * работают на Домене и / или локально СЭМ база данных, другие группы добавляются в ваш токен Windows, но я не верю, что существует публичный API для фильтрации вашего пути обратно к точному списку групп из SAM.

1

Другие решения

Других решений пока нет …