Определение роли пользователя в узле / рабочей области SharePoint с использованием API веб-сервисов

2

Как определить роль (роли) пользователя на сайте с помощью API веб-сервисов? Все, что мне нужно - это имя пользователя и домен.

Я обнаружил, что PermissionsService.Permissions.GetPermissionCollection(url, "Web" ) вернет коллекцию разрешенных пользователей и групп с масками разрешений, но мне все же нужно выяснить, является ли пользователь в любой из групп а затем преобразовать маски разрешений в коллекцию ролей.

Я чувствую, что есть лучший способ сделать это, и я просто пропустил его.

  • 0
    Не обязательно. Веб-сервисы SharePoint довольно ограничены.
Теги:
permissions
sharepoint

3 ответа

5

Я решил что-то подобное - мой метод проверяет, назначена ли пользователю определенная роль. Вот сначала алгоритм:

  • Проверить, назначена ли пользователю роль на сайте
  • Если да - круто, если нет - получить все группы, в которых пользователь является членом, и получить все группы, которым назначена эта роль.
  • Сравните два. Если есть подходящий - классный, если нет - пользователю не назначена роль на этом уровне сайта.

И код:

public bool IsAssignedAPermission(string premissionName, string userLoginName)
    {
        XmlNode nodes;
        bool isAssignedAPermission;

        isAssignedAPermission = false;

        //Check if user is directly assigned a Full Control role
        try
        {
            nodes = userGroupService.GetRoleCollectionFromUser(userLoginName);
            using (XmlNodeReader reader = new XmlNodeReader(nodes))
            {
                DataSet ds = new DataSet();
                ds.ReadXml(reader);
                DataTable dt = ds.Tables[1];
                foreach (DataRow row in dt.Rows)
                {
                    string permission = row[1].ToString();
                    if (permission == premissionName)
                    {
                        isAssignedAPermission = true;
                        break;
                    }
                }
            }
        }
        catch
        {
            List<string> groupMemberships;
            List<string> fullControlGroups;

            //Check if user is a member of a Full Control group
            //This is done in three steps:

            //1. Get the list of groups the user is member of
            groupMemberships = new List<string>();
            nodes = userGroupService.GetGroupCollectionFromUser(userLoginName);
            using (XmlNodeReader reader = new XmlNodeReader(nodes))
            {
                DataSet ds = new DataSet();
                ds.ReadXml(reader);
                DataTable dt = ds.Tables[1];
                foreach (DataRow row in dt.Rows)
                {
                    string groupName = row[1].ToString();
                    groupMemberships.Add(groupName);
                }
            }

            //2. Get the list of groups that have Full Control permissions
            fullControlGroups = new List<string>();
            nodes = userGroupService.GetGroupCollectionFromRole(premissionName);
            using (XmlNodeReader reader = new XmlNodeReader(nodes))
            {
                DataSet ds = new DataSet();
                ds.ReadXml(reader);
                DataTable dt = ds.Tables[1];
                foreach (DataRow row in dt.Rows)
                {
                    string groupName = row[1].ToString();
                    fullControlGroups.Add(groupName);
                }
            }

            //3. Check if user belongs to any of the Full Control groups
            foreach (string membership in groupMemberships)
            {
                if (fullControlGroups.Contains(membership))
                {
                    isAssignedAPermission = true;
                    break;
                }
            }
        }

        return isAssignedAPermission;
    }

Параметр метода userLoginName должен находиться в домене формы\имя пользователя, например. SHAREPOINT\Борис. Надеюсь, я помог. Приветствия

1

В этом сообщении в блоге я использую веб-службу UserGroup для перечисления групп SharePoint, к которым принадлежит пользователь: http://www.theblackknightsings.com/ListAllSharePointGroupsAUserBelongsTo.aspx

  • 1
    К сожалению, это не сработает, поскольку пользователям не обязательно быть частью групп SharePoint, чтобы иметь доступ к сайтам или коллекциям сайтов.
0

Попробуйте использовать метод GetRoleCollectionFromUser из веб-службы UserGroup, он предоставит вам список ролей, к которым принадлежит пользователь на вашем сайте.
Просто назовите его передачей в качестве параметра вашего домена\имя_пользователя.

Найти его определение здесь: http://msdn.microsoft.com/en-us/library/ms772680.aspx
Возвращенный xml будет выглядеть примерно так: тогда вы просто получите необходимую информацию.

<GetRoleCollectionFromUser xmlns="http://schemas.microsoft.com/sharepoint/soap/directory/">
<Roles>
<Role ID="1073741829" Name="Full Control" Description="Has full control." Order="1" Hidden="False" Type="Administrator" BasePermissions="FullMask" />
<Role ID="1073741825" Name="Limited Access" Description="Can view specific lists, document libraries, list items, folders, or documents when given permissions." Order="8" Hidden="True" Type="Guest" BasePermissions="ViewFormPages, Open, BrowseUserInfo, UseClientIntegration, UseRemoteAPIs" />
</Roles>
</GetRoleCollectionFromUser>
  • 0
    К сожалению, это работает только в том случае, если пользователь или группа были явно добавлены на сайт, если вы передадите имя пользователя, которое является частью группы, для которой определено, это вызовет ошибку.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню