Как я узнаю, является ли произвольный DOMAIN\username определенной ролью в C#?

Я действительно новичок в C#, так что прости мое невежество. Мне нужно проверить, находится ли пользователь (DOMAIN\username) в определенной группе, и да, это включает в себя вложенные группы.

Я обнаружил, что WindowsPrincipal.IsInRole() работает фантастически, когда имеешь дело с текущим вошедшим в систему пользователем. Это не так для меня, хотя. Мне нужно иметь возможность передать произвольный DOMAIN \ username или UPN (я сделаю все, что проще всего реализовать) и получить обратно true/false, если они являются членами группы X, даже если они являются только косвенными членами группа X (например, пользователь является членом группы Y, а группа Y является членом группы X).

Я смотрел на WindowsIdentityи, возможно, это плохо знакомо с C#, но я просто не видел способа сделать что-то вроде WindowsIdentity("MYDOMAIN\User1"), Ну, я сделал, но никогда не подходил близко к тому, чтобы заставить его работать.

Используя C# с заданным DOMAIN\username, который не будет текущим вошедшим в систему пользователем, как я могу определить, являются ли они членом DOMAIN\group?

4 ответа

Решение

Ответьте на собственный вопрос: я попробовал представленные решения, и не должен был заставить их работать. Обратите внимание, я на 100% уверен, что это связано с моей неопытностью в C#, а не с тем, что опубликовали комментаторы. Люблю и спасибо всем комментаторам, которые выручили.

Что сработало для меня, это: http://ddkonline.blogspot.com/2010/05/how-to-recursively-get-group-membership.html

Мне пришлось сделать некоторые базовые настройки, чтобы приведенное выше решение соответствовало моей ситуации (например, измените параметры LDAP), но в основном это сработало. Возвращает true, если член группы, иначе false. Я надеюсь, что это спасет будущих искателей волос, так как я уже потерял руку. Еще раз спасибо всем, кто отправил помощь.

Вот функция, которую я использую, которая работает, и вы должны иметь возможность использовать ее как есть. Вам, вероятно, придется создать ParseUserDomain но это довольно просто:

/// <summary>
/// Checks if a user in is a active directory group.
/// <summary>
/// <param name="username">Can contain the domain and username or just username
///    (eg. domain\username or username).  If no domain is specified, the default
///    domain is used.</param>
/// <param name="group">Active directory group to check.  Group name only.  No
///    leading domain as the domain from the user is used.</param>
/// <returns></returns>
public bool UserIsInActiveDirectoryGroup(string username, string group)
{
    bool isInGroup = false;
    string user = "";
    string domain = "";
    // Parses off domain and user to seperate values
    ParseUserDomain(username, out domain, out user);   

    if (string.IsNullOrEmpty(user) ||
        string.IsNullOrEmpty(domain) ||
        string.IsNullOrEmpty(group))
    {
        return false;
    }

    using (PrincipalContext ADContext = new PrincipalContext(ContextType.Domain,
        domain))
    {
        using (GroupPrincipal principalGroup = 
            GroupPrincipal.FindByIdentity(ADContext, group))
        {
            if (principalGroup != null)
            {
                using (UserPrincipal ADPrincipalUser = 
                    UserPrincipal.FindByIdentity(ADContext, user))
                {
                    // True means deep search
                    var users = principalGroup.GetMembers(true);
                    isInGroup = users.Contains(ADPrincipalUser);
                }
            }
        }
    }
    return isInGroup;
}

Я ответил рекурсивным запросом в похожей записи в переполнении стека, которая называется " Поиск рекурсивного членства в группах (Active Directory) с использованием C#". Изменение кода, который я дал там, может позволить вам делать то, что вы хотите.

Вы можете использовать LDAP-запрос для этого. Вот хорошая статья

Howto: (почти) все в Active Directory через C#

Другие вопросы по тегам