2017-09-06 18 views
1

J'utilise GetTokenInformation()/TokenGroups pour obtenir des groupes dont un utilisateur actuellement connecté est membre. Toutefois, la liste des groupes renvoyés par l'API inclut également des groupes spéciaux tels que "INTERACTIVE", "CONSOLE LOGON", "Accès compatible pré-Windows 2000", etc.Comment filtrer les groupes spéciaux retournés par GetTokenInformation()?

Quelle est la meilleure façon de filtrer les groupes spéciaux? ? Idéalement, j'aimerais ne conserver que les groupes que vous pouvez voir dans l'onglet «Membre de» de la boîte de dialogue Propriétés d'un utilisateur donné.

Merci.

+0

vous devez d'abord obtenir l'utilisateur * Sid * à partir de token, puis appelez * LookupAccountSid * pour obtenir le nom d'utilisateur et enfin * NetUserGetGroups * – RbMm

+0

plus exactement * NetUserGetLocalGroups * – RbMm

Répondre

1

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.