none
SSOM, свойство Users объекта SPWeb является пустой коллекцией. RRS feed

  • Вопрос

  • SP 2013, Visual Studio 2015. Перенес проект с удаленной машины, на которой развернут SP 2013 Server на свою виртуальную - SP 2013 Foundation. Проект переносил просто скопировав каталог. Выбрал файл .sln в студии - все открылось. Проблем с разверсткой проектов не наблюдалось, однако один проект я не могу развернуть. В нем я создаю группу пользователей. Сначала проверяю по имени, и если отсутствует, то создаю.

    Ошибка на такой  строке: Groups.Add(cnstWorkingWithNSIGroupName, web.Users[0], null, "");

    Ошибка такая: Error occurred in deployment step 'Activate Features': Заданный аргумент находится вне диапазона допустимых значений.

    Отладчик показывает, что web.Users является пустой коллекцией, на него и ругается. Переменная web = properties.Feature.Parent. Все дело происходит в обработчике FeatureActivated().

    Повторил действие на старой машине в проекте-оригинале - там все проходит без ошибок. В новом - ошибка. В MSDN написано, что  Users это: ... collection of user objects that are explicitly assigned permissions in the website. Если я правильно понимаю, это пользователи, которые явно сопоставлены с какими-либо разрешениями данного сайта.

    Смотрю "Параметры сайта" - "Пользователи и группы" - там есть по крайней мере одна группа "..._-владельцы", в которую входит пользователь - владелец сайта. Т.е. свойство Users не должно быть пустым. Разрешение у группы есть - полные права. Почему свойство Users объекта SPWeb моего сайта пусто?

    5 декабря 2016 г. 15:09

Ответы

  • Как вы правильно указали - SPWeb.Users - это пользователи, которым напрямую предоставили права, то есть это те пользователи которые не входят в группы. Используйте AllUsers - все пользователи сайта, либо SiteUsers - все пользователи коллекции сайтов.

    P.S. Также полезно проверять любые коллекции на наличие в них элементов, перед обращением к ним по индексу.


    My contributions: SharePoint 2010 Solution Installer

    • Помечено в качестве ответа Denis Prokofjev 6 декабря 2016 г. 8:21
    5 декабря 2016 г. 22:29
  • Спасибо, Aviw! Эти свойства работают, но вы меня подтолкнули к поиску и я нашел кое-что, даже более мне подходящее.

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

    В моем случае очень помогла статья http://blog.qumsieh.ca/2008/06/26/spweb-siteusers-vs-spweb-users/ - она первое, что мне попалось и предлагает подходящее мне решение. Это метод EnsureUser(logonMane). Я просто подставляю имя администратора и получаю то, что нужно. Делаю я это в блоке try-catch и с выключенным AllowUnsafeUpdates, т.к. мне не надо добавлять пользователя в текущий сайт. В случае, если метод не находит по имени пользователя на верхнем уровне - это должно означать явную ошибку.

    Так что вопрос решен!


    6 декабря 2016 г. 8:38

Все ответы

  • Как вы правильно указали - SPWeb.Users - это пользователи, которым напрямую предоставили права, то есть это те пользователи которые не входят в группы. Используйте AllUsers - все пользователи сайта, либо SiteUsers - все пользователи коллекции сайтов.

    P.S. Также полезно проверять любые коллекции на наличие в них элементов, перед обращением к ним по индексу.


    My contributions: SharePoint 2010 Solution Installer

    • Помечено в качестве ответа Denis Prokofjev 6 декабря 2016 г. 8:21
    5 декабря 2016 г. 22:29
  • Спасибо, Aviw! Эти свойства работают, но вы меня подтолкнули к поиску и я нашел кое-что, даже более мне подходящее.

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

    В моем случае очень помогла статья http://blog.qumsieh.ca/2008/06/26/spweb-siteusers-vs-spweb-users/ - она первое, что мне попалось и предлагает подходящее мне решение. Это метод EnsureUser(logonMane). Я просто подставляю имя администратора и получаю то, что нужно. Делаю я это в блоке try-catch и с выключенным AllowUnsafeUpdates, т.к. мне не надо добавлять пользователя в текущий сайт. В случае, если метод не находит по имени пользователя на верхнем уровне - это должно означать явную ошибку.

    Так что вопрос решен!


    6 декабря 2016 г. 8:38