3

Étant donné un nom de groupe et un compte d'utilisateur, j'aimerais savoir si l'utilisateur fourni appartient à un groupe particulier. L'utilisateur peut être un utilisateur local ou un utilisateur de domaine et le groupe peut être un groupe local ou un groupe de domaine et le groupe peut également être imbriqué dans d'autres groupes. En bref, je suis à la recherche d'une fonction comme bool IsUserMemberOf(User, Group) qui appellera en interne les API Win32 appropriées pour faire la recherche. Je suppose que le processus faisant la requête ci-dessus devrait avoir les privilèges nécessaires pour interroger les groupes locaux et AD. Je suppose que l'exécution du processus sous le compte d'administrateur d'entreprise devrait faire le travail d'interroger tous les contrôleurs de domaine dans la forêt mais peut ne pas fonctionner pour les machines qui ne font pas partie d'un domaine. Des idées sur quel compte ce processus d'interrogation devrait exécuter afin qu'il puisse interroger le LSA ainsi que l'AD?Comment calculer par programme si un compte d'utilisateur est un membre d'un groupe particulier dans Windows?

Répondre

1

Vous devez lire sur GetTokenInformation (TOKEN_USER), AllocateAndInitializeSid et CheckTokenMemberShip.

+0

La réponse n'a jamais été acceptée, peut-être parce que l'OP était dans la même situation que je suis: je n'ai pas un jeton, juste un SID et nom chacun pour le compte et le groupe. Est-il possible d'obtenir un jeton sans connaître le mot de passe? Ou, y a-t-il une fonction LSA qui le fera avec juste le SID? Je suis toujours coincé après la chasse. –

+0

Je suis dans la même position, il y a deux exemples officiels de Microsoft, ni travailler, les deux retournent toujours le groupe administrateur pour chaque utilisateur. – Owl

0

Magnus est juste, vous devez utiliser CheckTokenMembership

Vous pouvez trouver un échantillon UnlockPolicy.c (télécharger le full source here), la fonction ShouldUnlockForUser et UsagerEstDansGroupe (excusez mon français;).

est ici le courage de celui-ci:

HRESULT IsUserInGroup(HANDLE user, const wchar_t* groupe) 
{ 
    HRESULT result = E_FAIL; 
    SID_NAME_USE snu; 
    WCHAR szDomain[256]; 
    DWORD dwSidSize = 0; 
    DWORD dwSize = sizeof szDomain/sizeof * szDomain; 

    if ((LookupAccountNameW(NULL, groupe, 0, &dwSidSize, szDomain, &dwSize, &snu) == 0) 
      && (ERROR_INSUFFICIENT_BUFFER == GetLastError())) 
    { 
     SID* pSid = (SID*)malloc(dwSidSize); 

     if (LookupAccountNameW(NULL, groupe, pSid, &dwSidSize, szDomain, &dwSize, &snu)) 
     { 
      BOOL b; 

      if (CheckTokenMembership(user, pSid, &b)) 
      { 
       if (b == TRUE) 
       { 
        result = S_OK; 
       } 
      } 
      else 
      { 
       result = S_FALSE; 
      } 
     } 

     //Si tout vas bien (la presque totalitée des cas), on delete notre pointeur 
     //avec le bon operateur. 
     free(pSid); 
    } 

    return result; 
} 
+0

Qu'est-ce qu'un "handle"? Est-il possible de convertir un nom d'utilisateur en un handle? – Owl

+0

Un handle est renvoyé par une méthode qui authentifie l'utilisateur (comme 'LogonUser') ou le récupère du contexte actuel (comme' WTSQueryUserToken'). Lequel utiliser dépend grandement du contexte ... Posez une question, la communauté SO fournira une réponse plus utile! – ixe013

+1

Notez que cela ne fonctionnera pas pour un administrateur. Les administrateurs sont uniquement dans le groupe lorsque les privilèges sont escaladés. – Owl

Questions connexes