Как программно выяснить, является ли учетная запись пользователя членом определенной группы в Windows? - PullRequest
3 голосов
/ 23 июня 2009

Учитывая имя группы и учетную запись пользователя, я хотел бы знать, принадлежит ли предоставленный пользователь к определенной группе. Пользователь может быть локальным пользователем или пользователем домена, а группа может быть локальной группой или группой домена, и группа также может быть вложенной в другие группы. Короче говоря, я ищу функцию типа bool IsUserMemberOf(User, Group), которая будет вызывать соответствующие API-интерфейсы Win32 для выполнения поиска. Я предполагаю, что процесс, выполняющий вышеупомянутый запрос, должен иметь необходимые привилегии для запроса локальных групп и групп AD. Я предполагаю, что запуск процесса под учетной записью администратора предприятия должен выполнять работу по запросу любых контроллеров домена в лесу, но может не работать для компьютеров, которые не являются частью домена. Любые идеи о том, какой аккаунт должен выполнять этот процесс запросов, чтобы он мог запрашивать как LSA, так и AD?

Ответы [ 3 ]

1 голос
/ 23 июня 2009

UserPrincipal.IsMemberOf (GroupPrincipal)"возвращает логическое значение, которое указывает, является ли участник участником указанной группы".

1 голос
/ 09 июня 2011

Магнус прав, вы должны использовать CheckTokenMembership

Вы можете найти образец в UnlockPolicy.c (загрузить полный исходный код здесь ), функции ShouldUnlockForUser и UsagerEstDansGroupe (извините, мой французский;).

Вот как это происходит:

HRESULT IsUserInGroup(HANDLE user, const wchar_t* groupe)
{
    HRESULT result = E_FAIL;
    SID_NAME_USE snu;
    WCHAR szDomain[256];
    DWORD dwSidSize = 0;
    DWORD dwSize = sizeof szDomain / sizeof * szDomain;

    if ((LookupAccountNameW(NULL, groupe, 0, &dwSidSize, szDomain, &dwSize, &snu) == 0)
            && (ERROR_INSUFFICIENT_BUFFER == GetLastError()))
    {
        SID* pSid = (SID*)malloc(dwSidSize);

        if (LookupAccountNameW(NULL, groupe, pSid, &dwSidSize, szDomain, &dwSize, &snu))
        {
            BOOL b;

            if (CheckTokenMembership(user, pSid, &b))
            {
                if (b == TRUE)
                {
                    result = S_OK;
                }
            }
            else
            {
                result = S_FALSE;
            }
        }

        //Si tout vas bien (la presque totalitée des cas), on delete notre pointeur
        //avec le bon operateur.
        free(pSid);
    }

    return result;
}
1 голос
/ 23 июня 2009

Вам нужно прочитать GetTokenInformation (TOKEN_USER), AllocateAndInitializeSid и CheckTokenMemberShip .

...