我使用GetTokenInformation()/ TokenGroups来获取当前登录用户所属的组。但是,从API返回的组列表还包括特殊组,如“INTERACTIVE”,“CONSOLE LOGON”,“Pre-Windows 2000 Compatible Access”等。
过滤特殊群组的最佳方法是什么?理想情况下,我只想保留您在给定用户属性对话框的“成员”选项卡上可以看到的组。
感谢。
答案 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的确切的组列表。