C # - Как установить разрешения SharePoint для пользователя на дочернем сайте, а не на уровне root - PullRequest
0 голосов
/ 31 августа 2011

Я пытаюсь добавить разрешения для пользователя, который находится в дочернем сайте в SharePoint.Мне удалось успешно установить разрешения для пользователя на корневом уровне, но я не уверен, как решить проблему для дочернего сайта более низкого уровня.Ниже приведено то, что у меня есть в данный момент, но оно вылетает, хотя не показывает ошибок при сборке в VS.Любые идеи будут великолепны

        foreach (SPWeb subSite in spSite2.RootWeb.GetSubwebsForCurrentUser())
        {
            if (subSite.Name == "templates")
            {
                Console.WriteLine("\nTEMPLATES SITE");
                Console.Write("\nApplying 'Read' permission to App_user Account");
                spRoleAssignment = new SPRoleAssignment(SPContext.Current.Web.Users[appUserAccount]);
                spRoleAssignment.RoleDefinitionBindings.Add(SPContext.Current.Web.RoleDefinitions["Read"]);
                SPContext.Current.Web.RoleAssignments.Add(spRoleAssignment);
                SPContext.Current.Web.Update();
                Console.ForegroundColor = ConsoleColor.Green;
                Console.CursorLeft = Console.BufferWidth - 16; Console.WriteLine("Applied");
                Console.ForegroundColor = ConsoleColor.Gray;
            }
        }

Ответы [ 2 ]

1 голос
/ 31 августа 2011

Я не совсем уверен, чего вы пытаетесь достичь, и где ваш код должен выполняться (консольное приложение, задание таймера или веб-часть?).

Я вижу следующие проблемы:

  1. Вы входите в консоль (что позволяет предположить, что ваш код выполняется в консольном приложении), но вы получаете доступ к SPContext.Current, который доступен только в том случае, если ваш код выполняется в HTTP-запросе. 1009 *

  2. Вы перебираете коллекцию веб-сайтов. Но в вашем теле для каждого обновляется SPContext.Current.Web.

  3. Вы извлекаете свою веб-коллекцию через web.GetSubwebsForCurrentUser(), но затем меняете разрешения для этих объектов. Это немного пахнет, поскольку обновление прав - это «задача администратора», и метод GetSubwebsForCurrentUser более вероятно будет использоваться для низкоуровневого пользовательского контекста, чтобы избежать исключения отказа в доступе. Например, для безопасного отображения списка веб-сайтов.

  4. Вы обновляете разрешения / роли в сети, но отсутствует проверка наличия в сети уникальных назначений ролей.

  5. Вы проверяете сеть с названием «шаблоны». Поскольку GetSubwebsForCurrentUser не является рекурсивным, в этой коллекции может быть только одна сеть с именем «шаблоны». Эта сеть может быть открыта direclty => нет необходимости тратить ресурсы, открывая каждую суб-сеть.

Если ваша задача состоит в том, чтобы установить разрешения ролей для заданных веб-шаблонов (которые являются подуровнем 1-го уровня вашей корневой сети), вы можете использовать следующий код:

// Open the web directly since it is a direct child of the site collection.
// Use a using to properly release the resources
using (SPWeb web = spSite2.Open("templates"))
{
  SPUser user = web.SiteUsers[appUserAccount];
  SPRoleDefinition roleDef = web.RoleDefinitions.GetByType(SPRoleType.Reader);

  if (!web.HasUniqueRoleAssignments)
  {
    web.BreakRoleInheritance(true);
  }

  spRoleAssignment = new SPRoleAssignment(user);
  spRoleAssignment.RoleDefinitionBindings.Add(roleDef);
  web.RoleAssignments.Add(spRoleAssignment);

  // No need to update the web when changing the permissions
}
0 голосов
/ 31 августа 2011

Попытаться обновить роли в подсайте, а не в текущем веб-сайте из SPContext?

AFAIK каждый объект SPWeb имеет свои собственные назначения ролей.

...