É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
Vous devez lire sur GetTokenInformation (TOKEN_USER), AllocateAndInitializeSid et CheckTokenMemberShip.
UserPrincipal.IsMemberOf(GroupPrincipal) "renvoie une valeur booléenne qui spécifie si le principal est un membre du groupe spécifié".
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;
}
Qu'est-ce qu'un "handle"? Est-il possible de convertir un nom d'utilisateur en un handle? – Owl
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
Notez que cela ne fonctionnera pas pour un administrateur. Les administrateurs sont uniquement dans le groupe lorsque les privilèges sont escaladés. – Owl
- 1. compte mysql dans un groupe par
- 2. La meilleure façon de déterminer rapidement si un compte d'utilisateur est membre d'un groupe AD?
- 3. Comment vérifier si un utilisateur donné est membre du groupe Administrateurs intégré?
- 4. Demandez à ActiveDirectory si une machine est membre d'un groupe
- 5. Est-il possible de définir par programme le compte d'utilisateur pour un service Windows?
- 6. Comment arrêter un service Windows par programme?
- 7. Comment trouver si un utilisateur Windows appartient au groupe spécifié?
- 8. Comment savoir si un PropertyInfo est d'un type enum particulier?
- 9. OSGi: ajouter par programme des importations à un groupe
- 10. Comment puis-je tester par programme si un chemin/fichier est un raccourci?
- 11. Comment déplacer par programme des fichiers dans un répertoire WebDAV
- 12. Comment détecter si un moniteur est grand écran sous Windows
- 13. Comment supprimer le compte de groupe Windows en utilisant C#
- 14. Comment puis-je savoir si un SPWeb donné est un site SearchCenter par programme
- 15. Microsoft Reporting Services - comment calculer la somme des valeurs dans un groupe
- 16. Comment puis-je vérifier par programme si une application CYGWIN est installée dans un script SH?
- 17. Comment obtenir des groupes dont un membre est membre dans ActiveDirectory en utilisant C#?
- 18. Comment supprimer un raccourci annoncé par programme?
- 19. Comment associer par programme un nom comme COM51 à un port série physique dans Microsoft Windows?
- 20. Calculer par programme la mémoire occupée par un objet Java y compris les objets qu'il référence
- 21. Grouper par date dans un format particulier dans SQLAlchemy
- 22. Comment calculer par programme les cotes de poker?
- 23. Comment déterminer par programme comment un DVD ou un disque dur est connecté - Maître ou Esclave?
- 24. Déterminer par programme si un VOB donné est monté dans ClearCase
- 25. Comment puis-je déterminer si un groupe AD contient un DirectoryEntry donné d'un autre domaine (de confiance)?
- 26. Comment déterminer si un fichier est en ROM dans Windows Mobile?
- 27. Comment chronométrer un programme s'exécutant sous Windows?
- 28. Autoriser par programme ClearType dans Windows Mobile
- 29. Créer un compte utilisateur Vista
- 30. Comment générer un profil d'utilisateur local pour un nouveau compte d'utilisateur dans Windows?
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. –
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