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
----------------------------------------------
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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.
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)
{ 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
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.
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)
{
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
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.
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)
{ 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