Попытка получить SID домена с помощью API GetWindowsAccountDomainSid завершается неудачно с кодом ошибки ERROR_NON_ACCOUNT_SID

Моя цель — проверить, выполняется ли произвольный процесс под определенными (не локальными, доменными) учетными записями администратора. Я использую следующий код для этого:

check_membership(WinAccountDomainAdminsSid);
check_membership(WinAccountEnterpriseAdminsSid);
check_membership(WinAccountCertAdminsSid);
check_membership(WinAccountPolicyAdminsSid);
check_membership(WinAccountSchemaAdminsSid);

void check_membership(WELL_KNOWN_SID_TYPE wellKnownSidType)
{
//Most error checks are omitted for brevity!

HANDLE hToken;
HANDLE hImpToken;
HANDLE hProc = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pid);
OpenProcessToken(hProc, TOKEN_QUERY | TOKEN_DUPLICATE, &hToken);
DuplicateTokenEx(hToken, TOKEN_QUERY, NULL, SecurityImpersonation, TokenImpersonation, &hImpToken);

DWORD dwcbSize;
BYTE buffTokenUser[sizeof(TOKEN_USER) + SECURITY_MAX_SID_SIZE] = {0};
GetTokenInformation(hToken, TokenUser, buffTokenUser, sizeof(buffTokenUser), &dwcbSize);

BYTE buffDomainSid[SECURITY_MAX_SID_SIZE] = {0};
GetWindowsAccountDomainSid(((PTOKEN_USER)buffTokenUser)->User.Sid, buffDomainSid, &dwcbSize);

BYTE sid[SECURITY_MAX_SID_SIZE] = {0};
dwcbSize = sizeof(sid);
if(CreateWellKnownSid(wellKnownSidType, (PSID)buffDomainSid, sid, &dwcbSize))
{
BOOL bIsMember = FALSE;
if(CheckTokenMembership(hImpToken, &sid, &bIsMember))
{
wprintf(L"SidType=%d, Member: %s\n", wellKnownSidType, bIsMember ? L"Yes" : L"No");
}
}

CloseHandle(hToken);
CloseHandle(hImpToken);
CloseHandle(hProc);
}

Это работает для большинства процессов, но для некоторых GetWindowsAccountDomainSid не удается с кодом ошибки 1257, или же ERROR_NON_ACCOUNT_SID,

Как я могу получить SID домена в этом случае?

0

Решение

Задача ещё не решена.

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

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

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