我们的目的就是利用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);
此时如果不出错,就表示已经把这个自定义事件放到当前的列表中了。此时各自的用户组只能访问用户组中的记录了。
posted on 2009-06-11 16:57  季博望  阅读(1604)  评论(0编辑  收藏  举报