如何通过GetTokenInformation()返回的特殊组过滤

How to filter out special groups returned by GetTokenInformation()?

本文关键字:过滤 返回 何通过 GetTokenInformation      更新时间:2023-10-16

i使用getTokenInformation()/tokenGroups获取当前登录的用户的组。但是,从API返回的组列表还包括" Interactive"," Console Logon"," Pre-Windows 2000兼容访问"等特殊组。

过滤特殊组的最佳方法是什么?理想情况下,我只想保留您在给定用户属性对话框的"成员"选项卡上看到的组。

谢谢。

如注释中所建议的, 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。