Comme suggéré dans les commentaires, NetUserGetLocalGroups
est probablement la fonction utilisée dans le composant logiciel enfichable "Utilisateurs et groupes locaux".
Vous pouvez également filtrer la liste par tous les critères que vous choisissez:
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]);
}
}
Les fonctions Net * fonctionnent sur le domaine et/ou la base de données SAM locale, les autres groupes sont ajoutés à votre jeton par Windows mais je Ne croyez pas qu'il existe une API publique pour filtrer votre chemin vers la liste exacte des groupes de SAM.
vous devez d'abord obtenir l'utilisateur * Sid * à partir de token, puis appelez * LookupAccountSid * pour obtenir le nom d'utilisateur et enfin * NetUserGetGroups * – RbMm
plus exactement * NetUserGetLocalGroups * – RbMm