Я не совсем уверен, чего вы пытаетесь достичь, и где ваш код должен выполняться (консольное приложение, задание таймера или веб-часть?).
Я вижу следующие проблемы:
Вы входите в консоль (что позволяет предположить, что ваш код выполняется в консольном приложении), но вы получаете доступ к SPContext.Current
, который доступен только в том случае, если ваш код выполняется в HTTP-запросе. 1009 *
Вы перебираете коллекцию веб-сайтов. Но в вашем теле для каждого обновляется SPContext.Current.Web
.
Вы извлекаете свою веб-коллекцию через web.GetSubwebsForCurrentUser()
, но затем меняете разрешения для этих объектов. Это немного пахнет, поскольку обновление прав - это «задача администратора», и метод GetSubwebsForCurrentUser
более вероятно будет использоваться для низкоуровневого пользовательского контекста, чтобы избежать исключения отказа в доступе. Например, для безопасного отображения списка веб-сайтов.
Вы обновляете разрешения / роли в сети, но отсутствует проверка наличия в сети уникальных назначений ролей.
Вы проверяете сеть с названием «шаблоны». Поскольку 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
}