如何通过GetTokenInformation()返回的特殊组过滤
How to filter out special groups returned by GetTokenInformation()?
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。
相关文章:
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 什么时候在C++中返回常量引用是个好主意
- 你能重载对象变量名本身返回的内容吗
- 为什么 Serial.println(<char[]>);返回随机字符?
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 如何获取std::result_of函数的返回类型
- QueryWorkingSet总是返回false
- (C++)分析树以计算返回错误值的简单算术表达式
- 访问者访问变体并返回不同类型时出错
- 如何返回一个类的两个对象相加的结果
- OpenInventor从9.8升级到10.4.2后,GLSL纹理返回零
- lower_bound()返回最后一个元素
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 按扩展名过滤搜索文件会返回太多结果
- 幼稚的过滤返回错误的图像
- 如何通过GetTokenInformation()返回的特殊组过滤
- 返回已过滤集合的便捷方式
- 过滤函数中的矢量,并返回另一个带有过滤结果的矢量
- 过滤向量并返回第 n 个元素
- 如何过滤向量并返回指向向量元素的指针向量