none
Не удается получить список групп и пользователей sharepoint 2010 RRS feed

  • Вопрос

  • Задумка была такая: программа получает текущего пользователя, получает все группы портала, выбирает нужную, проверяет, состоит ли в ней текущий пользователь. Код следующий:

    ClientContext clientContext = ClientContext.Current;
                GroupCollection collGroup = clientContext.Web.SiteGroups;
                clientContext.Load(collGroup,
                    groups => groups.Include(
                        group => group.Title,
                        group => group.Id,
                        group => group.Users.Include(
                            user => user.Title,
                            user => user.LoginName)));
    
                clientContext.ExecuteQueryAsync((send, args) =>
                {
                    this.Dispatcher.BeginInvoke(new Action(() =>
                        {
                            foreach (Group oGroup in collGroup)
                            {
                                if (oGroup.Id == adminGroupId)
                                {
                                    UserCollection collUser = oGroup.Users;
    
                                    foreach (User oUser in oGroup.Users)
                                    {
                                        test.Text += "Пользователь в группе - " + oUser.LoginName;
                                        if (oUser.LoginName.CompareTo(user.LoginName) == 0)
                                        {
                                            //enable'м кнопки
                                            testBtn.Visibility = System.Windows.Visibility.Visible;
                                            test.Text += " - OK!\n";
                                        }
                                        else
                                            test.Text += " - NO OK!\n";
                                    }
                                }
                            }
                        }));
                }, null);
    Для пользователей, которые являются администраторами портала, отладка проваливается в begininvoke и всё прорабатывает нормально. Для простых же смертных, в begininvoke программа не попадает. Как тогда получать список групп? Можно ли вытащить из текущего пользователя все группы, в которых он состоит, чтобы потом сравнить с нужной?

    5 марта 2015 г. 3:05

Ответы

  • Пользователь может видеть информацию о пользователях, входящих в группу, если он сам в неё входит, либо если у группы в настройках стоит "Everyone" для "Who can view the membership of the group? ".

    В моём примере код можно обернуть в try...catch. Если срабатывает исключение, то значит пользователя нет в группе. 

        class Program
        {
            static void Main(string[] args)
            {
                ClientContext clientContext = new ClientContext("http://sp2");
                clientContext.Credentials = new NetworkCredential("mmmmmm\\fffff", "aaaaaaaaa");
    
                var me = clientContext.Web.CurrentUser;
                clientContext.Load(me);
                clientContext.ExecuteQuery();
    
                Console.WriteLine(IsCurrentUserInGroup(clientContext, 3));
            }
    
            static bool IsCurrentUserInGroup(ClientContext ctx, int groupId)
            {
                try
                {
                    GroupCollection collGroup = ctx.Web.SiteGroups;
                    Group oGroup = collGroup.GetById(groupId);
                    UserCollection collUser = oGroup.Users;
    
                    ctx.Load(collUser,
                        users => users.Include(
                            user => user.Title,
                            user => user.LoginName,
                            user => user.Email));
    
                    ctx.ExecuteQuery();
                    
                    return collUser.ToList().Any(u => u.LoginName == ctx.Web.CurrentUser.LoginName);
                }
                catch (ServerUnauthorizedAccessException ex)
                {
                    //access denied 
                    return false;
                }
            }
        }



    [custom.development]

    • Помечено в качестве ответа MA8IM 6 марта 2015 г. 3:00
    5 марта 2015 г. 14:45

Все ответы

  • Вы можете group получить по id:

    using System;
    using Microsoft.SharePoint.Client;
    
    namespace Microsoft.SDK.SharePointServices.Samples
    {
        class RetrieveSpecificUserProperties
        {
            static void Main()
            {
                ClientContext clientContext = new ClientContext("http://MyServer/sites/MySiteCollection");
                GroupCollection collGroup = clientContext.Web.SiteGroups;
                Group oGroup = collGroup.GetById(7);
                UserCollection collUser = oGroup.Users;
    
                clientContext.Load(collUser,
                    users => users.Include(
                        user => user.Title,
                        user => user.LoginName,
                        user => user.Email));
    
                clientContext.ExecuteQuery();
    
                foreach (User oUser in collUser)
                {
                    Console.WriteLine("User: {0} Login name: {1} Email: {2}", 
                        oUser.Title, oUser.LoginName, oUser.Email);
                }
            }
    }


    [custom.development]

    • Предложено в качестве ответа Alexander Surbashev 5 марта 2015 г. 7:50
    • Отменено предложение в качестве ответа MA8IM 5 марта 2015 г. 8:26
    5 марта 2015 г. 7:28
  • проблема не в том, чтобы получить определённую группу. Проблема в том, что для пользователя, не являющегося администратором портала, не прорабатывает метод 
    clientContext.ExecuteQueryAsync()
    точней внутренняя его часть
    • Изменено MA8IM 5 марта 2015 г. 8:37
    5 марта 2015 г. 8:36
  • В ExecuteQueryAsync добавьте параметр для вызова метода в случае ошибки (ClientRequestFailedEventHandler).
    Возможно, у пользователя не хватает прав для выполнения запроса.

    [custom.development]


    5 марта 2015 г. 8:45
  • скорей всего так и есть, и как в таком случае узнать, состоит ли он в нужной группе?
    5 марта 2015 г. 8:50
  • Если вы хотите узнать, состоит ли текущий пользователь в какой-то группе, то можете использовать свойтво Groups (ClientContext.Web.СurrentUser.Groups).

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

    [custom.development]

    5 марта 2015 г. 9:00
  • это бы решило все проблемы, но в ClientContext.Web.СurrentUser нет поля Groups, поэтому и пришлось вытаскивать группу отдельно а юзера отдельно, чтобы проверить состоит ли он в этой группе.

    На самом деле мне нужно просто скрыть определённые кнопки в программе от посторонних глаз (юзеров, которые не состоят в нужной группе). Если есть другой способ, то подскажите.

    UPD: в FailedHandler проваливается, если прав не хватает на получение групп. Только пока не доходит до меня, чем это может помочь.

    • Изменено MA8IM 5 марта 2015 г. 9:14
    5 марта 2015 г. 9:09
  • Пользователь может видеть информацию о пользователях, входящих в группу, если он сам в неё входит, либо если у группы в настройках стоит "Everyone" для "Who can view the membership of the group? ".

    В моём примере код можно обернуть в try...catch. Если срабатывает исключение, то значит пользователя нет в группе. 

        class Program
        {
            static void Main(string[] args)
            {
                ClientContext clientContext = new ClientContext("http://sp2");
                clientContext.Credentials = new NetworkCredential("mmmmmm\\fffff", "aaaaaaaaa");
    
                var me = clientContext.Web.CurrentUser;
                clientContext.Load(me);
                clientContext.ExecuteQuery();
    
                Console.WriteLine(IsCurrentUserInGroup(clientContext, 3));
            }
    
            static bool IsCurrentUserInGroup(ClientContext ctx, int groupId)
            {
                try
                {
                    GroupCollection collGroup = ctx.Web.SiteGroups;
                    Group oGroup = collGroup.GetById(groupId);
                    UserCollection collUser = oGroup.Users;
    
                    ctx.Load(collUser,
                        users => users.Include(
                            user => user.Title,
                            user => user.LoginName,
                            user => user.Email));
    
                    ctx.ExecuteQuery();
                    
                    return collUser.ToList().Any(u => u.LoginName == ctx.Web.CurrentUser.LoginName);
                }
                catch (ServerUnauthorizedAccessException ex)
                {
                    //access denied 
                    return false;
                }
            }
        }



    [custom.development]

    • Помечено в качестве ответа MA8IM 6 марта 2015 г. 3:00
    5 марта 2015 г. 14:45
  • Да, таким образом всё прорабатывает как надо, спасибо!

    ps: странно, такой код я уже писал в самом начале, но отчего-то он отказывался работать, а сейчас заработал... ExecuteQuery() кстати ругается и выдаёт исключение, работает ExeсuteQueryAsync().


    • Изменено MA8IM 6 марта 2015 г. 3:03
    6 марта 2015 г. 3:03