Вы можете использовать метод SPUtility.GetPrincipalsInGroup
( MSDN ).
Все параметры говорят сами за себя, кроме string input
, который является именем учетной записи NT группы безопасности:
bool reachedMaxCount;
SPWeb web = SPContext.Current.Web;
int limit = 100;
string group = "Domain\\SecurityGroup";
SPPrincipalInfo[] users = SPUtility.GetPrincipalsInGroup(web, group, limit, out reachedMaxCount);
Обратите внимание, что этот метод не разрешает вложенные группы безопасности. Кроме того, исполняющий пользователь должен иметь разрешение на просмотр информации о пользователе (SPBasePermissions.BrowseUserInfo
) в текущей сети.
Обновление:
private void ResolveGroup(SPWeb w, string name, List<string> users)
{
foreach (SPPrincipalInfo i in SPUtility.GetPrincipalsInGroup(w, name, 100, out b))
{
if (i.PrincipalType == SPPrincipalType.SecurityGroup)
{
ResolveGroup(w, i.LoginName, users);
}
else
{
users.Add(i.LoginName);
}
}
}
List<string> users = new List<string>();
foreach (SPUser user in SPContext.Current.Web.AllUsers)
{
if (user.IsDomainGroup)
{
ResolveGroup(SPContext.Current.Web, user.LoginName, users);
}
else
{
users.Add(user.LoginName);
}
}
Edit:
[...] прибегая к запросам Active Directory (этого я бы предпочел избегать, потому что вам, вероятно, необходимы достаточные права для выполнения таких операций [...]
Это правда, конечно, но SharePoint также должен искать AD. Вот почему учетная запись службы пула приложений должна иметь доступ для чтения к AD.
Другими словами, вы должны безопасно выполнять запросы к AD, если выполняете свой код, возвращенный к учетной записи процесса.