Получение членов доменной группы AD с использованием API Sharepoint
В моем коде Sharepoint я отображаю список всех определенных пользователей через:
foreach (SPUser user in SPContext.Current.Web.AllUsers)
{
...
}
Самое замечательное в том, что я могу добавить группу безопасности домена в группу Sharepoint (например, "Посетители"), тем самым добавив сразу несколько пользователей (более простое администрирование). Но мой код не видит этих пользователей, по крайней мере, до тех пор, пока они не войдут в систему в первый раз (если у них достаточно прав). В этом случае я вижу только группу безопасности домена SPUser
экземпляр объекта с его IsDomainGroup
установлен в true
,
Можно ли получить членов группы домена с помощью Sharepoint, не прибегая к запросам Active Directory (чего я бы предпочел избегать, потому что вам, вероятно, нужны достаточные права для таких операций = больше администрирования: права на Sharepoint + права на AD).
2 ответа
Вы можете использовать метод 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);
}
}
Редактировать:
[...] прибегая к запросам Active Directory (чего я бы предпочел избегать, потому что вам, вероятно, нужны достаточные права для выполнения таких операций [...]
Это правда, конечно, но SharePoint также должен искать AD. Вот почему учетная запись службы пула приложений должна иметь доступ для чтения к AD. Другими словами, вы должны быть в безопасности, выполняя запросы к AD, если вы запускаете свой код, возвращенный к учетной записи процесса.
Я хотел бы предложить вам просто запросить Active Directory напрямую. Вы тратите много усилий, чтобы заставить SharePoint сделать этот вызов для вас AD. Каждая учетная запись, имеющая доступ пользователя домена, должна иметь возможность запрашивать группы AD, вложенные в SharePoint. Я бы просто пошел к источнику.
Таким образом, вам не нужно беспокоиться о разрешениях пользователя или что-то еще. По моему мнению, попытка прокси-сервера через SharePoint только усложняет вашу жизнь.