【发布时间】:2017-08-21 20:04:22
【问题描述】:
我想了解的是LogonUser 和LOGON32_LOGON_INTERACTIVE 是否产生受限令牌?这是我的代码:
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 attribute -> %ld \n",gio, pPrivilegesToken->Groups[i].Attributes);
fflush(fp);
}
LocalFree (gio);
return 1;
}
由LOGON32_LOGON_INTERACTIVE 获得的令牌运行。我的输出是这样的:
Value: S-1-5-21-1018819917-2920201817-244685803-513 attribute -> 7
Value: S-1-1-0 attribute -> 7
Value: S-1-5-21-1018819917-2920201817-244685803-1000 attribute -> 7
Value: S-1-5-32-544 attribute -> 16
Value: S-1-5-32-545 attribute -> 7
Value: S-1-5-4 attribute -> 7
Value: S-1-2-1 attribute -> 7
Value: S-1-5-11 attribute -> 7
Value: S-1-5-15 attribute -> 7
Value: S-1-5-5-0-19732224 attribute -> -1073741817
Value: S-1-5-64-10 attribute -> 7
Value: S-1-16-8192 attribute -> 96
注意16 和Administrators Group。如果我使用LOGON32_LOGON_BATCH,我会得到这个:
S-1-5-21-1018819917-2920201817-244685803-513 attribute -> 7
Value: S-1-1-0 attribute -> 7
Value: S-1-5-21-1018819917-2920201817-244685803-1000 attribute -> 7
Value: S-1-5-32-544 attribute -> 15
Value: S-1-5-32-545 attribute -> 7
Value: S-1-5-3 attribute -> 7
Value: S-1-2-1 attribute -> 7
Value: S-1-5-11 attribute -> 7
Value: S-1-5-15 attribute -> 7
Value: S-1-2-0 attribute -> 7
Value: S-1-5-5-0-20537541 attribute -> -1073741817
Value: S-1-5-64-10 attribute -> 7
Value: S-1-16-12288 attribute -> 96
我也发现有些人和我有同样的问题。
-
IsAdminUser returns incorrect value
-
In Windows: How do you programatically launch a process in administrator mode under another user context?
- How to call LogonUser() to get a non-restricted full token inside a Windows Service with UAC enabled?
在我看来LOGON32_LOGON_INTERACTIVE 会产生受限令牌(或者只是不同类型的登录会产生不同类型的令牌?),是否有任何文档可以验证我是对的?
【问题讨论】:
-
Win32:API是用 C 语言编写的(作为 XS 模块),您可以查看 IsAdminUser here 的实现 -
您是在询问 UAC 提升令牌吗?受限令牌是一个特定的东西,请不要使用该术语,除非您实际上是在谈论受限令牌!受限令牌比您的常规登录令牌更受限制。
-
是的。它为您提供了一个 UAC(“LUA”)过滤令牌。文档?不是真的,也没有理由。 UAC 上的文档说你得到了一个过滤的令牌。有趣的部分是其他登录类型(BATCH 等)不会产生过滤令牌。这才是真正需要文档的地方。它在哪里说有免于 UAC 的登录类型?
-
@Anders:你是对的,但是文档(和符号)已经够混乱了,所以可以理解。过滤的令牌“比您的常规登录令牌更受限制”,因此您的解释没有描述差异。用来证明这些东西的复杂性。
-
... 跟进我之前的评论,事实证明,为了使用该方法获得可用的提升令牌,您必须拥有 SeTcbPrivilege。通常,如果您作为本地系统运行,您将只有此权限。否则,您将不得不使用前面讨论过的
LOGON32_LOGON_BATCH。