Как я могу перечислить все объекты 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".