SharePoint 中列表的用户组权限

来源:互联网 发布:生成器 python 编辑:程序博客网 时间:2024/06/05 09:30
 
我们的目的就是利用SharePoint 中列表的权限,列表中各记录根据自己的用户组权限,仅供各用户组所属用户访问。
1、在添加列表后,设置列表权限,把其它的用户组全部删除,只保留自己所需要的用户组。

2、使用VS2005 ,添加普通的类,引用C:/Program Files/Common Files/Microsoft Shared/Web Server Extensions/12/ISAPI/Microsoft.SharePoint.dll。继承SPItemEventReceiver类,重写AddedItem方法。

 

public override void ItemAdded(SPItemEventProperties properties)
        {
            SPSecurity.RunWithElevatedPrivileges(delegate()      //用此方法模拟管理员账户运行此事件处理程序
            {
                using (SPSite site = new SPSite(properties.SiteId))    //用此方法的话就不用dispose()了
                {
                    using (SPWeb web = site.OpenWeb(properties.OpenWeb().ID)) //注意获得web的方法!!!
                    {
                        try
                        {
                            SPList list = web.Lists[properties.ListId];     //获得触发事件的列表
                            //获得触发事件的列表条目
                            SPListItem item = list.Items.GetItemById(properties.ListItemId);
                            //将此条目取消权限继承,如果是“false”,则将去除所有权限,只保留系统账户,如果是“true”,则将上一级权限复制过来。
                            if (!item.HasUniqueRoleAssignments)
                            {
                                item.BreakRoleInheritance(false);
                            }
                            //权限定义
                            SPRoleDefinition RoleDefinition = web.RoleDefinitions.GetByType(SPRoleType.Contributor);
                            //获取用户所在组
                            string groupName = IsInGroup(web, properties.UserLoginName.Split(':')[1]);
                            writetxt(groupName +"ab");
                            SPMember mem = web.SiteGroups[groupName];
                            SPPrincipal sp = (SPPrincipal)mem;
                            SPRoleAssignment ra = new SPRoleAssignment(sp);
                            //将此角色分配绑定权限级别
                            ra.RoleDefinitionBindings.Add(RoleDefinition);
                            //将此新权限绑定到列表条目上
                            item.RoleAssignments.Add(ra);
                            item.Update();
                        }
                        catch (Exception ee)
                        {
                            writetxt(ee.ToString());
                        }
                    }
 
                }
            }
            );
        }
 
 
这个类必须是加密钥,利用VS2005命令提示行生成SNK文件,在工程文件AssemblyInfo.cs里面加上
[assembly: AssemblyDelaySign(false)]     //是否要延迟签名 false:不延迟签名 true:延迟签名
[assembly: AssemblyKeyFile("roadlist.snk")]    //密钥文件的路径
然后生成DLL文件,利用gacutil/I file.dll命令方式将DLL文件加入GAC。
 
然后建一个控制台程序,引用C:/Program Files/Common Files/Microsoft Shared/Web Server Extensions/12/ISAPI/Microsoft.SharePoint.dll。
 
在主程序中加入出境
//根据网站集的Url得到网站集对象
SPSite site = new SPSite("http://sharepointsever:60000");
SPList list = web.Lists["列表名称"];
string asmName = "2000EventHandler, Version=1.0.0.0, Culture=neutral, PublicKeyToken=79be99334218e9f4";//程序集名称
string className = "_000EventHandler.DemoEventHandler";//程序集中的类名
list.EventReceivers.Add(SPEventReceiverType.ItemAdded, asmName, className);
此时如果不出错,就表示已经把这个自定义事件放到当前的列表中了。此时各自的用户组只能访问用户组中的记录了。