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

时间:2017-09-06 13:30:00

标签: c++ winapi active-directory active-directory-group

我使用GetTokenInformation()/ TokenGroups来获取当前登录用户所属的组。但是,从API返回的组列表还包括特殊组,如“INTERACTIVE”,“CONSOLE LOGON”,“Pre-Windows 2000 Compatible Access”等。

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

感谢。

1 个答案:

答案 0 :(得分: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的确切的组列表。