我需要SPUser
从SPGroup
. 不幸的是,该组可能包含 Active Directory 组,因此简单SPGroup.Users
是不够的(我只SPUser
为 AD 组获取一个,IsDomainGroup
属性设置为 true)。
有谁知道如何获得所有的列表SPUser
,下降到包含在一个中的任何 Active Directory 组SPGroup
?有没有替代方法可以SPGroup.ContainsCurrentUser
接受SPUser
参数?
我需要SPUser
从SPGroup
. 不幸的是,该组可能包含 Active Directory 组,因此简单SPGroup.Users
是不够的(我只SPUser
为 AD 组获取一个,IsDomainGroup
属性设置为 true)。
有谁知道如何获得所有的列表SPUser
,下降到包含在一个中的任何 Active Directory 组SPGroup
?有没有替代方法可以SPGroup.ContainsCurrentUser
接受SPUser
参数?
根据我发现的一篇博客文章,我编写了以下代码:
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;
}
}
我不喜欢必须模拟每个用户的事实,并且此代码只会找到已导入 SharePoint 的 AD 用户(因此SPUser
对他们来说存在),但这对我来说已经足够了。
不幸的是,可能并非 AD 组的每个成员在站点中都有相应的 SPUser 对象(目前)。
在这种情况下,我将枚举活动目录组的所有成员,并使用 SPWeb 的EnsureUser()
方法强制它们进入站点,该方法返回一个SPUser
,如果站点中不存在它,则创建一个新成员。
有关枚举 Active Directory 成员的指导,请参阅Get List of Users From Active Directory In A given AD Group。