Sharepoint:Web部件以编程方式更改权限,无法使更改保持不变

时间:2012-03-13 15:29:35

标签: sharepoint sharepoint-2010 permissions web-parts

我正在为visualpoint 2010中的visual studio编写一个可视化Web部件。此Web部件的重点是通过单击按钮更改权限。我可以访问权限并将其输出到屏幕。我可以更改我拥有的对象的权限,然后在屏幕上显示更改的权限。我的问题是,一切都完成后,没有实际的权限被更改。

webpart.TargetLibrary是一个文本字段,在其他地方输入,作为我要调查的图书馆的名称。

SPListCollection docLibs = m_SharePointWeb.GetListsOfType(SPBaseType.DocumentLibrary);
SPDocumentLibrary targetLib = (SPDocumentLibrary)(docLibs[webPart.TargetLibrary]);
SPListItemCollection libFolders = targetLib.Folders;
  SPListItem folderItem = libFolders[0];
  SPRoleAssignmentCollection folderRoles = folderItem.RoleAssignments;
    SPRoleAssignment roleAssign = folderRoles[0];
    SPRoleDefinitionBindingCollection spRDBC = roleAssign.RoleDefinitionBindings;
    SPRoleDefinition Contribute = spRDBC[0].ParentWeb.RoleDefinitions["Contribute"];
  folderItem.RoleAssignments[0].RoleDefinitionBindings.Add(Contribute);
  folderItem.Update();    

这是一个有点简化的版本 - 原版有一些for循环和其他代码做其他事情。无论如何,通过在线查看我能够拼凑的所有内容,此代码将“Contribute”priv添加到第一个文件夹列表中的第一个角色。正如我所提到的,它对本地对象这样做,但没有永久效果。 Update()调用似乎什么都不做,我不确定它是否适用于这种情况。我尝试过UpdateOverwriteVersion() - 它也没有做任何事情。对于我可能做错的任何建议都将不胜感激。

作为旁注,这并不是一个问题,但我无法理解有一种更有效和直接的方式来获取Web对象,以便我可以通过名称获取角色定义。关于这个问题的任何建议也将受到赞赏。

编辑:解决方案已移至下方回答。

1 个答案:

答案 0 :(得分:1)

我找到了基本和旁注的答案。

对于旁注,以下内容看起来是获取适当SPWeb对象的预期方式。

SPContext.Current.Web.RoleDefinitions["Contribute"];

对于基础,问题是Sharepoint显然不保存SPRoleAssignment中的更改角色 - 仅授予或删除整个文件夹的权限。这可能与我在文件夹中工作的事实有关,也可能与此无关。在任何情况下,为了使其保存,您必须从SPRoleAssignmentCollection中删除此人,更改其SPRoleAssignment,然后重新添加更改的版本。上述代码的正确版本(整合两个答案)如下所示。

SPRoleDefinition Contribute = SPContext.Current.Web.RoleDefinitions["Contribute"];
SPListCollection docLibs = m_SharePointWeb.GetListsOfType(SPBaseType.DocumentLibrary);
SPDocumentLibrary targetLib = (SPDocumentLibrary)(docLibs[webPart.TargetLibrary]);
SPListItemCollection libFolders = targetLib.Folders;
  SPListItem folderItem = libFolders[0];
  SPRoleAssignmentCollection folderRoles = folderItem.RoleAssignments;
    SPRoleAssignment roleAssign = folderRoles[0];
    folderRoles.Remove(roleAssign.Member);
    roleAssign.RoleDefinitionBindings.Add(Contribute);
    folderRoles.Add(roleAssign);