在某一项目中,用户有如下需求:用户上传到文档库的文件或是在文档库中新建的文件夹,他们能够自己设置权限,并且新上传的文件或是新建的文件夹对于自己来说拥有“完全控制权限”,对其他用户只拥有读取权限,该用户有权让其他用户拥有“参与讨论”或是“权限设置”的权限。众所周知,一个新上传的文件或是一个新建的文档库,它们的权限是继承文档库的权限,而文档库的权限针对于某个用户来说至少是“参与讨论”,因为在拥有“参与讨论”权限时,用户能够执行上传文件和新建文件夹操作,所以需要通过事件来控制新的上传文件和新建文件夹的默认权限。写两个“EventHandler”。
一个是针对于新建文件夹的EventHandler,此EventHandler的写法与列表的EventHandler写法相同,废话少说,代码如下:
public class NewDocumentControlPermission : SPItemEventReceiver { public override void ItemAdded(SPItemEventProperties properties) { //base.ItemAdded(properties); try { SPSecurity.RunWithElevatedPrivileges(delegate() { using (SPSite site = new SPSite(properties.SiteId)) { using (SPWeb web = site.OpenWeb(properties.OpenWeb().ID)) { web.AllowUnsafeUpdates = true; SPUser user = web.Users.GetByID(properties.CurrentUserId); SPListItem item = properties.ListItem; //获得触发此事件的用户的登录名 SPRoleAssignment ra1 = new SPRoleAssignment(web.EnsureUser(user.LoginName)); ra1.RoleDefinitionBindings.Add(web.RoleDefinitions["完全控制"]); item.BreakRoleInheritance(true); item.RoleAssignments.Add(ra1); for (int count = 0; count < item.RoleAssignments.Count; count++) { SPRoleAssignment spra = item.RoleAssignments[count]; for (int i = 0; i < spra.RoleDefinitionBindings.Count; i++) { //if (spra.RoleDefinitionBindings[i].Name == "受限访问") //{ // item.BreakRoleInheritance(true); // item.RoleAssignments.Remove(spra.Member); //} if (spra.RoleDefinitionBindings[i].Name == "参与讨论") { if (!spra.RoleDefinitionBindings.Contains(web.RoleDefinitions["读取"])) { spra.RoleDefinitionBindings.Add(web.RoleDefinitions["读取"]); } spra.RoleDefinitionBindings.Remove(web.RoleDefinitions["参与讨论"]); //item.RoleAssignments[count].RoleDefinitionBindings[i].Update(); spra.Update(); item.SystemUpdate(false); } else if (spra.RoleDefinitionBindings[i].Name == "用户权限") { if (!spra.RoleDefinitionBindings.Contains(web.RoleDefinitions["读取"])) { spra.RoleDefinitionBindings.Add(web.RoleDefinitions["读取"]); } spra.RoleDefinitionBindings.Remove(web.RoleDefinitions["用户权限"]); //spra.RoleDefinitionBindings[i].Update(); spra.Update(); item.SystemUpdate(false); } } } web.AllowUnsafeUpdates = false; } } }); } catch { } } }
具体如何部署此EventHandler,此处不再赘述。
另一个是针对于上传新文件的EventHandler,此EventHandler的写法与列表的EventHandler写法大不相同,废话少说,代码如下:
public class ControlPermission : IListEventSink { void IListEventSink.OnEvent(Microsoft.SharePoint.SPListEvent listEvent) { try { if (listEvent.Type == SPListEventType.Insert)//增加{} { SPSecurity.RunWithElevatedPrivileges(delegate() { SPWeb web = listEvent.Site.OpenWeb(); SPFile file = web.GetFile(listEvent.UrlAfter); SPListItem item = file.Item; //添加个人完全权限 SPUser user = file.Author; SPRoleAssignment sa = new SPRoleAssignment((SPPrincipal)user); SPRoleDefinition role = web.RoleDefinitions["完全控制"]; sa.RoleDefinitionBindings.Add(role); item.BreakRoleInheritance(true); item.RoleAssignments.Add(sa); //修改部门全体为读取权限 for (int count = 0; count < item.RoleAssignments.Count; count++) { SPRoleAssignment spra = item.RoleAssignments[count]; for (int i = 0; i < spra.RoleDefinitionBindings.Count; i++) { //if (spra.RoleDefinitionBindings[i].Name == "受限访问") //{ // item.BreakRoleInheritance(true); // item.RoleAssignments.Remove(spra.Member); //} if (spra.RoleDefinitionBindings[i].Name == "参与讨论") { if (!spra.RoleDefinitionBindings.Contains(web.RoleDefinitions["读取"])) { spra.RoleDefinitionBindings.Add(web.RoleDefinitions["读取"]); } spra.RoleDefinitionBindings.Remove(web.RoleDefinitions["参与讨论"]); //item.RoleAssignments[count].RoleDefinitionBindings[i].Update(); spra.Update(); item.SystemUpdate(false); } else if (spra.RoleDefinitionBindings[i].Name == "用户权限") { if (!spra.RoleDefinitionBindings.Contains(web.RoleDefinitions["读取"])) { spra.RoleDefinitionBindings.Add(web.RoleDefinitions["读取"]); } spra.RoleDefinitionBindings.Remove(web.RoleDefinitions["用户权限"]); //spra.RoleDefinitionBindings[i].Update(); spra.Update(); item.SystemUpdate(false); } } } }); } } catch { } } }
注:此处的“用户权限”是作者自己在sharepoint2007自己添加的一种权限,勾选此权限,用户可以自己管理文档库文件和文件夹的权限。
关于如何部署此事件,请参阅本作者搜集转载的文章-------“如何部署文档库EventHandler”。