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

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

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

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

谢谢。

最佳答案

如评论中所建议,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 添加到您的 token ,但我不相信有公共(public) API 可以过滤您从 SAM 返回到确切组列表的方式。

关于c++ - 如何过滤掉GetTokenInformation()返回的特殊组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46076611/

相关文章:

c++ - 理解 C++ 函数指针在 HIP 中通过引用传递

c++ - void main的由来是什么?

c - 系统托盘中的 Windows 服务消息

windows - golang当前运行进程列表,Windows版本

wordpress - Azure AD 与 Office365 连接

c++ - DirectX 11:创建多个对象

c# - native 可执行文件中的字符串表资源

java - 在 Java 的 ActiveDirecotry 中通过 LDAP 解析对象的 GUID 来获取对象的名称

C# 在 AD 中链接组策略

c++ - 如何在 C++ 中使用 scanf() 读取字符串?