Как проверить членство в группе для процесса, который не является «самостоятельным»?

Я пытаюсь использовать этот код проверить членство в группе безопасности для произвольного процесса, для которого у меня есть дескриптор. Но в моем коде ниже CheckTokenMembership ошибка с кодом ошибки 1309 или ERROR_NO_IMPERSONATION_TOKEN, Я не уверен, что понимаю, как я могу получить этот знак подражания …

Так что я здесь не так делаю?

void check_membership(HANDLE hProc)
{
HANDLE hToken;
if(OpenProcessToken(hProc, TOKEN_QUERY, &hToken))
{
check_group_membership(hToken, L"Local Group", DOMAIN_ALIAS_RID_USERS);
check_group_membership(hToken, L"Admin Group", DOMAIN_ALIAS_RID_ADMINS);
check_group_membership(hToken, L"Domain Admin Group", DOMAIN_GROUP_RID_ADMINS);
check_group_membership(hToken, L"Schema Admin Group", DOMAIN_GROUP_RID_SCHEMA_ADMINS);
check_group_membership(hToken, L"Enterprise Admin Group", DOMAIN_GROUP_RID_ENTERPRISE_ADMINS);

CloseHandle(hToken);
}
}void check_group_membership(HANDLE hToken, LPCTSTR pStrName, DWORD nSubauthority)
{
BOOL bIsMember;
SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY;

wprintf(L"Local %s: ", pStrName);

PSID pSID = NULL;
if(AllocateAndInitializeSid(&NtAuthority, 2,
SECURITY_BUILTIN_DOMAIN_RID,
nSubauthority,
0, 0, 0, 0, 0, 0, &pSID))
{
bIsMember = FALSE;
if(CheckTokenMembership(hToken, pSID, &bIsMember))
{
wprintf(L"%s", bIsMember ? L"Yes" : L"No");
}
else
{
wprintf(L"<CheckErr: (%d)>", GetLastError());
}
}
else
{
wprintf(L"<SidErr: (%d)>", GetLastError());
}

wprintf(L"\n");

if(pSID)
{
FreeSid(pSID) == NULL);
pSID = NULL;
}

}

1

Решение

MSDN подтверждает, что это требование:

Маркер должен быть маркером подражания.

Это также говорит для случая с дескриптором NULL:

CheckTokenMembership использует маркер олицетворения вызывающего потока. Если поток не олицетворяет себя, функция дублирует основной токен потока, чтобы создать токен олицетворения.

Вы можете попробовать это:

HANDLE hImpToken;
if (DuplicateTokenEx(hToken, TOKEN_QUERY, NULL, SecurityImpersonation, TokenImpersonation, &hImpToken))
{
CheckTokenMembership(hImpToken, ...);
CloseHandle(hImpToken);
}
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]