Perl: IsAdminUser renvoie une valeur incorrecte

Je suis nouveau avec Perl. J’utilise la fonction Win32::IsAdminUser() (impossible de coller du code car pour le rendre exécutable, il faudrait coller du code entier). Il retourne 0, j’étais curieux de savoir pourquoi parce que l’utilisateur avec lequel cela est exécuté est membre du groupe Administrateurs, j’ai donc créé une petite fonction de test (c ++) et l’exécutant juste avant d’exécuter IsAdminUser Voici le code:

 int davai() { FILE * fp; fp = fopen ("C:\\tmp\\davai.txt", "a"); fprintf(fp, "shevedi davai"); fflush(fp); HANDLE token = NULL; HANDLE dupToken = NULL; if(!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY | TOKEN_DUPLICATE, &token)) { fprintf(fp, "davai: OpenProcessToken cheijva. %d\n", (int)GetLastError()); fflush(fp); } if (DuplicateTokenEx(token, MAXIMUM_ALLOWED, NULL, SecurityDelegation, TokenPrimary, &dupToken) == 0) { fprintf(fp, "davai: OpenProcessToken DuplicateTokenEx. %d\n", (int)GetLastError()); fflush(fp); } PTOKEN_GROUPS pPrivilegesToken = NULL; DWORD cbSize = 0; GetTokenInformation(dupToken, TokenGroups, NULL, 0, &cbSize); pPrivilegesToken = (PTOKEN_GROUPS) LocalAlloc(LPTR, cbSize); if (GetTokenInformation(dupToken, TokenGroups, pPrivilegesToken, cbSize, &cbSize) == FALSE) { fprintf(fp, "davai: GetTokenInformation cheijva. %d\n", (int)GetLastError()); fflush(fp); } char * gio; for (ULONG i = 0; i GroupCount; i++) { if (ConvertSidToSsortingngSid(pPrivilegesToken->Groups[i].Sid, &gio) == 0) { fprintf(fp, "davai: ConvertSidToSsortingngSid cheijva. %d\n", (int)GetLastError()); fflush(fp); } fprintf(fp, "Value: %s\n",gio); fflush(fp); } LocalFree (gio); return 1; } 

qui ouvre simplement le jeton des processus en cours et répertorie tous les groupes dans lesquels l’utilisateur est impliqué. Voici le résultat obtenu:

 shevedi davaiValue: S-1-5-21-1018819917-2920201817-244685803-513 Value: S-1-1-0 Value: S-1-5-21-1018819917-2920201817-244685803-1000 Value: S-1-5-32-544 Value: S-1-5-32-545 Value: S-1-5-4 Value: S-1-2-1 Value: S-1-5-11 Value: S-1-5-15 Value: S-1-5-5-0-179095 Value: S-1-2-0 Value: S-1-5-64-10 Value: S-1-16-12288 

ce qui est étrange car S-1-5-32-544 représente le groupe des Administrators . J’ai cherché pour trouver si quelqu’un a le même problème, mais n’ai rien trouvé (je suis sous Windows 7). Peut-être que tu peux m’aider. Toute aide serait appréciée.

ce qui est étrange car S-1-5-32-544 représente le groupe des administrateurs.

vraiment Win32::IsAdminUser() appelle en interne la fonction CheckTokenMembership avec SidToCheck == S-1-5-32-544 et vous renvoie IsMember comme résultat. mais

Si le SID est présent et possède l’atsortingbut SE_GROUP_ENABLED, IsMember renvoie TRUE; sinon, il retourne FALSE.

et

Même si un SID est présent dans le jeton, le système peut ne pas utiliser le SID dans une vérification d’access. Le SID peut être désactivé ou avoir l’atsortingbut SE_GROUP_USE_FOR_DENY_ONLY .

vraiment si votre utilisateur est membre du groupe d’administration ( S-1-5-32-544 ) mais s’exécute sans élévation (sous UAC ) S-1-5-32-544 est présent dans le jeton mais avec l’atsortingbut SE_GROUP_USE_FOR_DENY_ONLY uniquement

au contraire, les administrateurs élevés ont ce SID avec l’atsortingbut SE_GROUP_ENABLED

donc je suppose que vous exécutez en tant qu’administrateur non élevé. Win32::IsAdminUser() et doit renvoyer false dans ce cas

Comme documenté dans Win32 :

Sous Windows Vista, la valeur non nulle sera renvoyée uniquement si le processus est en cours d’exécution avec des privilèges élevés.

Je comprendrais “Vista” comme “Vista et plus récent”.