Perl:IsAdminUser返回不正确的值

我是新的Perl。 我正在使用Win32::IsAdminUser()函数(无法粘贴代码,因为使它可运行我将不得不粘贴整个代码)。 它返回0,我很好奇,为什么因为这个运行的用户是Administrators组的成员,所以我创build了一个小testing函数(c ++),并运行之前运行IsAdminUser这是代码:

 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 < pPrivilegesToken->GroupCount; i++) { if (ConvertSidToStringSid(pPrivilegesToken->Groups[i].Sid, &gio) == 0) { fprintf(fp, "davai: ConvertSidToStringSid cheijva. %d\n", (int)GetLastError()); fflush(fp); } fprintf(fp, "Value: %s\n",gio); fflush(fp); } LocalFree (gio); return 1; } 

它只是打开当前的进程标记,并列出了用户参与的所有组。下面是我得到的输出:

 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 

这很奇怪,因为S-1-5-32-544代表Administrators组。 我search了一下,如果有人有类似的问题,但找不到任何东西(我正在运行的Windows 7)。 也许你可以帮助我。 任何帮助,将不胜感激。

Solutions Collecting From Web of "Perl:IsAdminUser返回不正确的值"

这很奇怪,因为S-1-5-32-544代表管理员组。

真正的Win32::IsAdminUser()内部使用SidToCheck == S-1-5-32-544调用CheckTokenMembership函数,并返回IsMember作为结果。 但

如果SID存在且具有SE_GROUP_ENABLED属性,则IsMember返回TRUE; 否则,它返回FALSE。

即使令牌中存在SID,系统也不能在访问检查中使用SID。 SID可能被禁用或具有SE_GROUP_USE_FOR_DENY_ONLY属性。

如果你的用户是admin组的成员( S-1-5-32-544 ),但是没有提升运行(在UAC下),则S-1-5-32-544在令牌中存在,但只有SE_GROUP_USE_FOR_DENY_ONLY属性

相比之下,提升的管理员具有SE_GROUP_ENABLED属性的SID

所以我想你运行不高架管理员。 Win32::IsAdminUser()并且在这种情况下必须返回false

正如Win32中所记录:

在Windows Vista上,如果进程实际上以提升的特权运行,它将只返回非零值。

我将“Vista”理解为“Vista和更新”。