gpt4 book ai didi

c - IsAdminUser 返回不正确的值

转载 作者:可可西里 更新时间:2023-11-01 11:11:40 27 4
gpt4 key购买 nike

我正在使用 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;
}

它只打开当前进程 token ,并列出用户参与的所有组。这是我得到的输出:

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)。也许你可以帮助我。任何帮助将不胜感激。

最佳答案

which is strange because S-1-5-32-544 represent Administrators group.

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

If the SID is present and has the SE_GROUP_ENABLED attribute, IsMember returns TRUE; otherwise, it returns FALSE.

Even if a SID is present in the token, the system may not use the SID in an access check. The SID may be disabled or have the SE_GROUP_USE_FOR_DENY_ONLY attribute.

真的,如果您的用户是管理员组 (S-1-5-32-544) 的成员,但在没有提升的情况下运行(在 UAC 下)S- 1-5-32-544 存在于 token 中,但仅具有 SE_GROUP_USE_FOR_DENY_ONLY 属性

相比之下,提升的管理员拥有此 SIDSE_GROUP_ENABLED 属性

所以我猜你以未提升的管理员身份运行。 Win32::IsAdminUser() 并且在这种情况下必须返回 false

关于c - IsAdminUser 返回不正确的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43069983/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com