Как я могу перечислить все объекты SPUser в SPGroup?

Мне нужно получить все SPUserэто из SPGroup, К сожалению, группа может содержать группы Active Directory, поэтому простой SPGroup.Users не достаточно (я бы просто получить один SPUser для группы AD, с IsDomainGroup свойство установлено в true).

Кто-нибудь есть хорошая идея, как я могу получить список всех SPUserв любой группе Active Directory, содержащейся в SPGroup? Есть ли альтернатива SPGroup.ContainsCurrentUser это занимает SPUser параметр?

2 ответа

Решение

Основываясь на найденном мной посте в блоге, я написал следующий код:

private static List<SPUser> ListUsers(SPWeb web, SPPrincipal group)
{
    try
    {
        web.Site.CatchAccessDeniedException = false;
        var users = new List<SPUser>();
        foreach(SPUser user in web.SiteUsers)
        {
            using(var userContextSite = new SPSite(web.Site.ID, user.UserToken))
            {
                try
                {
                    using (var userContextWeb = userContextSite.OpenWeb(web.ID))
                    {
                        try
                        {
                            if (userContextWeb.SiteGroups[group.Name]
                                .ContainsCurrentUser)
                                    users.Add(user);
                        }
                        catch (SPException)
                        {
                            // group not found, continue
                        }
                    }
                }
                catch(UnauthorizedAccessException)
                {
                    // user does not have right to open this web, continue
                }
            }
        }
        return users;
    }
    finally
    {
        web.Site.CatchAccessDeniedException = true;
    }
}

Мне не нравится тот факт, что мне приходится выдавать себя за каждого отдельного пользователя, и этот код найдет только тех пользователей AD, которые уже были импортированы в SharePoint (поэтому SPUser существует для них), но для меня этого достаточно.

К сожалению, может случиться так, что не каждый член группы AD имеет соответствующий объект SPUser на сайте (пока).

В этом сценарии я бы перечислил всех членов группы активных каталогов и принудительно ввел бы их на сайт с помощью SPWeb. EnsureUser() метод, который возвращает SPUserи создает новый, если он еще не существует на сайте.

Инструкции по перечислению элементов активного каталога см. В разделе " Получение списка пользователей из Active Directory в данной группе AD".

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