Как я узнаю, является ли произвольный DOMAIN \ username определенной ролью в C #? - PullRequest
1 голос
/ 13 сентября 2011

Я действительно новичок в 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 ]

0 голосов
/ 13 сентября 2011

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

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

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

0 голосов
/ 13 сентября 2011

Вот функция, которую я использую, которая работает, и вы должны быть в состоянии использовать ее как есть.Вам, вероятно, придется создать 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;
}
0 голосов
/ 13 сентября 2011

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

0 голосов
/ 13 сентября 2011

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

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

...