我是perl的新手。我正在使用Win32::IsAdminUser()
函数(无法粘贴代码,因为要使其可运行,我必须粘贴整个代码)。它返回0,我很好奇为什么因为运行它的用户是Administrators组的成员,所以我创建了一个小测试函数(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
组。我搜索了一下是否有人有类似的问题,但找不到任何东西(我正在运行Windows 7)。也许你可以帮助我。任何帮助将不胜感激。
答案 0 :(得分:3)
这很奇怪,因为 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 属性。
确实,如果您的用户是管理员组的成员( S-1-5-32-544 )但是没有提升运行(在 UAC 下) S- 1-5-32-544 存在于令牌中但仅包含 SE_GROUP_USE_FOR_DENY_ONLY 属性
相比之下,提升的管理员将此 SID 与 SE_GROUP_ENABLED 属性
相对应所以我猜你运行时没有提升管理员。 Win32::IsAdminUser()
并且在这种情况下必须返回false
答案 1 :(得分:2)