OVH Cloud OVH Cloud

Tester si user appartient a un groupe

1 réponse
Avatar
sybaris
Bonjour,

Quelqu'un aurait un bout de code pour savoir si le user "toto"
appartient au groupe "administrateur" ou "utilisateur avec pouvoir".

Merci d'avance...

JP
---------------------------------------------
Jean-Pierre Planas : http://membres.lycos.fr/sybaris/
---------------------------------------------
MASTER OPERATING SYSTEM : Graphical Interface
------ Like a Visual Pascal For Dos ---------
For Pascal Programmers. More Information here :
http://www.mos.fr.st
----------------------------------------------

1 réponse

Avatar
Patrick Philippot
sybaris wrote:
Quelqu'un aurait un bout de code pour savoir si le user "toto"
appartient au groupe "administrateur" ou "utilisateur avec pouvoir".



Bonjour,

---------------
Methode #1
---------------

1. Il faut d'abord récupérer un Access Token pour cet utilisateur. Selon
le contexte, la méthode peut différer mais en général, on va utiliser
l'API LogonUser pour récupérer un Access Token (disons hUser dans la
suite) à partir du nom et du mot de passe.

2. A partir de l'Access Toekn, on peut récupérer des infos sur le user
et vérifier s'il s'agit d'un Admin (code ci-dessous pour un Admin).
Extrait d'un de mes programmes.

PSID pAdminSid = NULL;
BYTE buffer[1024];
PTOKEN_GROUPS pGroups = (PTOKEN_GROUPS)buffer;
DWORD dwSize;
DWORD nIndex;
BOOL bSuccess;
SID_IDENTIFIER_AUTHORITY siaNtAuth = SECURITY_NT_AUTHORITY;

bSuccess = GetTokenInformation(hUser, TokenGroups, (LPVOID)pGroups,
1024, &dwSize);

if (bSuccess)
{
if (AllocateAndInitializeSid(&siaNtAuth,
2,
SECURITY_BUILTIN_DOMAIN_RID,
DOMAIN_ALIAS_RID_ADMINS,
0,0,0,0,0,0,
&pAdminSid))
{
bSuccess = FALSE;
for (nIndex = 0; (nIndex < pGroups->GroupCount) && !bSuccess;
nIndex++)
{
if (EqualSid(pAdminSid, pGroups->Groups[nIndex].Sid))
{
bSuccess = TRUE;
break;
}
}

FreeSid(pAdminSid);
}
}
m_bIsAdmin = bSuccess;

L'inconvénient de cette approche est qu'il faut connaître le password de
l'utilisateur sauf si vous cherchez à déterminer l'appartenance de
l'utilisateur courant, auquel cas on peut accéder à l'Access Token via
OpenThreadToken par exemple, si on est sûr que le thread courant tourne
sous le contexte sécurité de l'utilisateur visé.

---------------
Méthode #2
---------------

Utiliser NetUserGetGroups ou NetUserGetLocalGroups. Voici un exemple de
code (crédit Mark Phaedrus)

BOOL IsUserInGroup(LPWSTR uniUsername,LPWSTR uniGroupname)

{
NET_API_STATUS status;
GROUP_USERS_INFO_0 * groupInfo;
// Pointers to available info on groups

DWORD entriesread,totalentries,index;

status = NetUserGetGroups (NULL,uniUsername,0,
(LPBYTE
*)&groupInfo,MAX_PREFERRED_LENGTH,
&entriesread,&totalentries);
if (status)
chokeAndDie();

// Check each one to see if it's the group we're after

for (index = 0; index < entriesread; index++) {
if (!_wcsicmp(uniGroupname,

groupInfo[index].grui0_name)) {
// Yep, the user's a member; we're done
NetApiBufferFree(groupInfo);
return TRUE;
}
}

// Nope, not a member
NetApiBufferFree(groupInfo);
return FALSE;
}

Attention! Les groupes sont récupérés par nom dans ce cas (et pas par
SID), ce qui peut poser problème en cas d'utilisation du programme sous
une version de l'OS utilisant une autre langue.

---------------
Méthode #3
---------------

Une variante possible des méthodes #1 et #2 serait de récupérer le SID
de chaque groupe auquel l'utilisateur appartient avec LookupAccountSid
(chaque nom de groupe récupéré avec NetUserGetGroups passé en argument à
LookupAccountSid) et de faire, pour chaque SID récupéré, la même
comparaison que dans la méthode #1 (EqualSid) avec le SID du groupe
Admin.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr