Найти группу активных каталогов текущих пользователей С++

Как мне узнать, к какой группе активного каталога принадлежит текущий пользователь, вошедший в систему? Я предполагаю, что это будет через LDAP, но я не смог найти много информации о том, как получить эту конкретную информацию.

Я собрал некоторый код, но я не совсем уверен, что мне нужно делать дальше

    // Open the access token associated with the calling process.
if (OpenProcessToken(GetCurrentProcess(),
                     TOKEN_QUERY,
                     &hToken) == FALSE)
{
    dwErrorCode = GetLastError();
    wprintf(L"OpenProcessToken failed. GetLastError returned: %d\n", dwErrorCode);
    return HRESULT_FROM_WIN32(dwErrorCode);
}

// Retrieve the token information in a TOKEN_USER structure.
GetTokenInformation(hToken,
                    TokenUser,      // Request for a TOKEN_USER structure.
                    NULL,
                    0,
                    &dwBufferSize);

pTokenUser = (PTOKEN_USER) new BYTE[dwBufferSize];
memset(pTokenUser, 0, dwBufferSize);
if (GetTokenInformation(hToken,
                        TokenUser,
                        pTokenUser,
                        dwBufferSize,
                        &dwBufferSize))
{
    CloseHandle(hToken);
}
else
{
    dwErrorCode = GetLastError();
    wprintf(L"GetTokenInformation failed. GetLastError returned: %d\n", dwErrorCode);
    return HRESULT_FROM_WIN32(dwErrorCode);
}

if (IsValidSid(pTokenUser->User.Sid) == FALSE)
{
    wprintf(L"The owner SID is invalid.\n");
    delete [] pTokenUser;
}

person thecaptain0220    schedule 17.08.2010    source источник


Ответы (1)


В вашем конкретном случае, я думаю, вы можете обойтись без каких-либо вызовов LDAP. Вот предложение:

  • используйте GetCurrentProcessId и OpenProcess, чтобы получить дескриптор текущего процесса
  • вызовите OpenProcessToken для этого дескриптора, чтобы открыть токен доступа, связанный с текущим процессом
  • вызовите GetTokenInformation для этого токена доступа с классом информации о токене TokenGroups
  • результирующая структура TOKEN_GROUPS содержит список с SID и атрибутами всех групп в токене доступа
  • вызовите LookupAccountSid по SID каждой группы в списке, чтобы получить ее имя

MSDN должен предоставить более подробную информацию об упомянутых выше вызовах.

person Catalina Iacob    schedule 18.08.2010
comment
Я начал собирать код, но не уверен, что мне нужно сделать на последнем шаге, используя LookupAccountSid. - person thecaptain0220; 19.08.2010
comment
Предположим, что вызов GetTokenInformation был успешным; теперь у вас должен быть указатель на структуру TOKEN_GROUPS, ptokengroups. Для каждой из ptokengroups->GroupCount групп позвоните LookupAccountSid на ptokengroups->Groups[idx].Sid. - person Catalina Iacob; 20.08.2010
comment
Я вижу, вы отредактировали вопрос и добавили код, который использует GetTokenInformation с TokenUser вместо TokenGroups, хотя изначально вы сказали, что хотите получить группы, членом которых является текущий пользователь. В любом случае, учитывая код, теперь вы можете получить имя и домен пользователя, вызвав LookupAccountSid, сначала с NULL выходными буферами для получения их размеров, а затем с допустимыми: LookupAccountSid(NULL, (pTokenUser->User).Sid, name, &namesize, domainname, &domainnamesize, &use), с SID_NAME_USE use = SidTypeUnknown. Аналогично поступите с группами. - person Catalina Iacob; 23.08.2010