我正在尝试对文档库中的文件夹操作SPListItem权限,但我似乎无法添加任何新权限,但删除安全继承可以很好地工作。
我已尽力为测试目的创建代码的精简版本。函数GetListItem根据URL返回我们正在使用的SPListItem。 item.BreakRoleInheritance(False)
效果很好,我已经验证正确中断了继承并清除了任何权限,我还尝试使用True标记并验证所有原始权限都是从父级复制的。
下面的代码不会抛出异常,据我所知,似乎工作正常,直到我检查文档库中文件夹的实际权限,并看到未列出“查看器”。
代码:
Dim item As SPListItem = GetListItem(URL)
If item Is Nothing Then
Exit Sub
End If
Dim spGrp = SharePointWeb.SiteGroups("Viewers")
Dim spRole As SPRoleDefinition = SharePointWeb.RoleDefinitions("Read")
Dim roleAssignment As New SPRoleAssignment(spGrp)
roleAssignment.RoleDefinitionBindings.Add(spRole)
SharePointWeb.AllowUnsafeUpdates = True
item.BreakRoleInheritance(False)
item.RoleAssignments.Add(roleAssignment)
item.Update()
SharePointWeb.AllowUnsafeUpdates = False
我尝试在调用SPSecurity.RunWithElevatedPrivileges
时包装此代码,但它没有任何区别。我的SPSite / SPWeb对象的创建包含在对SPSecurity.RunWithElevatedPrivileges
的调用中,并且我还有其他代码可以使用此现有代码查找/删除/更新文件夹/ etc等属性。只是权限不想工作。
参考文献:
- http://moldenco.blogspot.com/2007/05/spsecurityrunwithelevatedprivileges-to.html
- How to give an SPGroup permissions for an SPItem?
- http://blogs.msdn.com/b/joelo/archive/2007/10/05/sharepoint-roles-assignments.aspx
答案 0 :(得分:0)
通过研究问题并尝试各种不同的方法,我遇到了异常,“由于SPWebEnsureSPControl中出现的对象的当前状态,操作无效。”
我做了一些谷歌搜索并找到了这个论坛帖子http://social.msdn.microsoft.com/forums/en-US/sharepointdevelopment/thread/32869ac6-4f47-46b8-accf-f56966ac9581,它引导我修改我的代码。在调用System.Web.HttpContext.Current = Nothing
之后,我将SPSecurity.RunWithElevatedPrivileges
作为第一行代码,一切都开始工作了。
所以我的代码看起来像(使用一个自治委托):
SPSecurity.RunWithElevatedPrivileges(Sub()
System.Web.HttpContext.Current = Nothing
........
End Sub)
从我读到的内容System.Web.HttpContext.Current
仍然与您的非提升帐户有关联,并通过将其设置为null来解决问题。
答案 1 :(得分:0)
试试这样。如果由于权限仍然遇到这些方法的问题,请尽量不使用提升的权限,而是模仿。我在下面的权限方法中发布了一个方法:
public static void SetPermissions(SPListItem item, IEnumerable<SPPrincipal> principals)
{
try
{
if (item != null)
{
foreach (SPPrincipal principal in principals)
{
SPRoleDefinition roleDefinition = item.Web.RoleDefinitions[Constants.SiteCollection.SecurityTypeNames.contribute];
SetPermissions(item, principal, roleDefinition);
}
}
}
catch (SPException exc)
{
//catch exception
}
}
/// <summary>
/// setpermissions method for one group
/// </summary>
/// <param name="item"></param>
/// <param name="principal"></param>
/// <param name="roleType"></param>
public static void SetPermissions(SPListItem item, SPPrincipal principal)
{
if (item != null)
{
SPRoleDefinition roleDefinition = item.Web.RoleDefinitions[Constants.SiteCollection.SecurityTypeNames.contribute];
SetPermissions(item, principal, roleDefinition);
}
}
/// <summary>
/// permission setting method used by previous two setpermissions method
/// </summary>
/// <param name="item"></param>
/// <param name="principal"></param>
/// <param name="roleDefinition"></param>
public static void SetPermissions(SPListItem item, SPPrincipal principal, SPRoleDefinition roleDefinition)
{
if (item != null)
{
item.Web.AllowUnsafeUpdates = true;
SPRoleAssignment roleAssignment = new SPRoleAssignment(principal);
roleAssignment.RoleDefinitionBindings.Add(roleDefinition);
item.RoleAssignments.Add(roleAssignment);
item.Web.AllowUnsafeUpdates = false;
}
}
模仿方法:
public static SPWeb GetImpersonatedWeb(SPSite impSite, string impWebUrl)
{
ILogger logger = SharePointServiceLocator.GetCurrent().GetInstance<ILogger>();
try
{
SPUserToken systoken = impSite.SystemAccount.UserToken;
using (SPSite site = new SPSite(impSite.Url, systoken))
{
SPWeb web = site.AllWebs[GetServerRelUrlFromFullUrl(impWebUrl)];
return web;
}
}
catch (SPException exc)
{
//catch exception
}
}
public static SPSite GetImpersonatedSite()
{
try
{
SPSite impSite = SPContext.Current.Site;
SPUserToken systoken = impSite.SystemAccount.UserToken;
SPSite site = new SPSite(impSite.Url, systoken);
return site;
}
catch (SPException exc)
{
//catch exception
}
}
public static string GetServerRelUrlFromFullUrl(string url)
{
int index = url.IndexOf("//");
if ((index < 0) || (index == (url.Length - 2)))
{
throw new ArgumentException();
}
int startIndex = url.IndexOf('/', index + 2);
if (startIndex < 0)
{
return "/";
}
string str = url.Substring(startIndex);
if (str.IndexOf("?") >= 0)
str = str.Substring(0, str.IndexOf("?"));
if (str.IndexOf(".aspx") > 0)
str = str.Substring(0, str.LastIndexOf("/"));
if ((str.Length > 1) && (str[str.Length - 1] == '/'))
{
return str.Substring(0, str.Length - 1);
}
return str;
}