我试图操作文档库中文件夹的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的调用中,而且我还有其他运行的代码,它在文件夹/等等上查找/删除/更新属性。使用此现有代码;只是权限不想工作。
参考文献:
发布于 2011-10-21 13:57:36
通过对这个问题的研究,并尝试对不同的方法进行验证,我遇到了一个异常,即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,可以解决问题。
发布于 2011-11-02 12:17:55
像这样试试。如果由于权限的原因,这些方法仍然有问题,请不要使用提升的私密性,而是使用模拟。为此,我在权限方法下面发布了一个方法:
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;
}https://stackoverflow.com/questions/7828646
复制相似问题