Получение членов домена AD с использованием API Sharepoint

В моем коде Sharepoint я показываю список всех определенных пользователей через:

foreach (SPUser user in SPContext.Current.Web.AllUsers)
{
    ...
}

Большая часть заключается в том, что я могу добавить группу безопасности домена в группу Sharepoint (например, "Посетители" ), добавив сразу несколько пользователей (более простое администрирование). Но мой код не видит этих пользователей, по крайней мере, до тех пор, пока они не войдут в систему в первый раз (если у них есть достаточные права). В этом случае я могу увидеть только экземпляр объекта безопасности домена SPUser с его IsDomainGroup, установленным на true.

Можно ли получить члены группы домена с помощью Sharepoint, не обращаясь к запросу Active Directory (чего я бы скорее избежал, потому что вам, вероятно, нужны достаточные права для выполнения таких операций = больше администрирования: Права Sharepoint + права AD).

Ответы

Ответ 1

Вы можете использовать метод 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) в текущей сети.

Update:

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, если вы запустили код, возвращенный к учетной записи процесса.

Ответ 2

Я бы предложил вам просто запросить Active Directory напрямую. Вы тратите много усилий, чтобы попытаться заставить SharePoint сделать этот вызов для AD для вас. Каждая учетная запись, которая имеет доступ к домену, должна иметь возможность запрашивать группы AD, которые вы вложили в SharePoint. Я бы просто пошел к источнику.

Таким образом, вам не нужно беспокоиться о просмотре пользовательских разрешений или что-то еще. На мой взгляд, попытка прокси-сервера через SharePoint просто усложняет вашу жизнь.