【发布时间】:2017-08-21 13:15:21
【问题描述】:
我正在使用Win32::IsAdminUser() 函数(无法粘贴代码,因为要使其可运行,我必须粘贴整个代码)。它返回 0,我很好奇为什么因为运行它的用户是管理员组的成员,所以我创建了一个小测试函数 (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)。也许你可以帮助我。任何帮助将不胜感激。
【问题讨论】:
-
你忽略了 group 的属性。你没有检查
SE_GROUP_USE_FOR_DENY_ONLY -
不仅打印 Sid 还打印来自
SID_AND_ATTRIBUTES的 Attributes - 之后您可能会明白用户没有 S-1- 5-32-544 真的 -
好的,我会检查一下
-
和你所说的
DuplicateTokenEx?!直接从原始令牌查询