2017-09-06 6 views
1

私はGetTokenInformation()/ TokenGroupsを使用して、現在ログオンしているユーザーがのメンバであるグループを取得します。ただし、APIから返されたグループのリストには、「インタラクティブ」、「コンソールログオン」、「Windows 2000以前の互換アクセス」などの特別なグループも含まれています。GetTokenInformation()によって返された特別なグループをフィルタリングする方法は?

特殊グループを除外する最良の方法?理想的には、特定のユーザーのプロパティダイアログボックスの「所属先」タブに表示されるグループのみを保持したいと考えています。

ありがとうございました。

+0

トークンから* Sid *を取得してから、ユーザー名を取得するために* LookupAccountSid *を呼び出し、最後に* NetUserGetGroups * – RbMm

+0

をもっと正確に* NetUserGetLocalGroups * – RbMm

答えて

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]); 
     } 
    } 

ネット*関数は、ドメインおよび/またはローカルSAMデータベース上で動作し、他のグループは、Windowsによって、あなたのトークンに追加されますが、私SAMのグループの正確なリストに戻ってあなたの方法をフィルタリングするパブリックAPIがあるとは思わない。

関連する問題