我正在尝试为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;
}
}
答案 0 :(得分:1)
我不完全确定您要实现的目标,也不确定您的代码应该在何处执行(控制台应用程序或计时器作业或Web部件?)。
我看到以下问题:
您登录到控制台(让我假设您的代码在控制台应用程序中运行),但您访问SPContext.Current
,这只有在您的代码在HTTP请求中运行时才可用。
您正在迭代一组网络。但是在你的每个机构中,SPContext.Current.Web
都会更新。
您可以通过web.GetSubwebsForCurrentUser()
检索您的网络集,但随后会更改这些对象的权限。这有点气味,因为更新权限是“管理任务”,方法GetSubwebsForCurrentUser
更有可能用于低级用户上下文以避免访问被拒绝的异常。例如,要安全地显示网络列表。
您确实更新了网络上的权限/角色,但检查网络是否具有唯一的角色分配。
您检查名为“templates”的网站。由于GetSubwebsForCurrentUser
不是递归的,因此此集合中只能有一个名为“templates”的Web。这个网站可以打开direclty =>不需要通过打开每个子网来浪费资源。
如果您的任务是在给定的网络“模板”(这是您的根网站的第一级子网站)上设置角色权限,您可以使用以下代码:
// 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
}
答案 1 :(得分:0)
尝试更新subSite中的角色,而不是来自SPContext的当前网页?
AFAIK每个SPWeb对象都有自己的角色分配。