itle in english:set Item Level Permission for SharePoint  (MOSS/WSS) List/Document Library Programmatically

  有些时候,我们需要为文档库里面某个文件设置特殊的权限,这个权限不继承自列表权限,当然最简单的最好是再创建一个列表,然后存储相关文件,这样做目的是达到了,但是却会带来很多冗余。虽说sharepoint的用户权限系统强大,但是他最小的粒度也只到了列表级别,所以我们这里研究小于列表级别的权限就显得非常有必要了。

  在sharepoint中,系统自带的权限可以用下图描述出来,蓝线表示我们的listitem实际是继承了list的权限系统,那么他的所有读写权限都是一样的

  蓝线表示我们的listitem实际是继承了list的权限系统,那么他的所有读写权限都是一样的。这样会带来一个问题,那就是如果我们现在因为业务逻辑的需要,必须对list内的某一个具体项目设置特定的权限,这种自带的权限系统就无法满足了。其实这样的需求还是蛮广泛的,并不是因为我或者某人凭空想象出来的,这里我们讨论的权限可以用我们的红线来表示,为每个listitem设置独立的权限系统。

  要实现listitem独立的权限系统,首先必须先打破继承,好在微软提供的相关的接口让我们完成这个工作

  使用代码SPListItem.BreakRoleInheritance(true);之后我们的权限逻辑图可以用下图来描述。

  好了,束缚也已经被打破了,下面我们来找一个切入点来实现我们的功能,在适当的时候加载我们的权限代码才能达到正确的效果,为了找到这个正确的时候,我们必须先了解一下listitem的创建过程,下图很直观的描述了listitem在添加时所触发的事件。

  这里我们用ItemUpdated 事件来完成我们的功能,为这个事件绑定一个处理逻辑,为了简单起便,我这里只给出了逻辑部分。在ItemUpdated事件发生时,调用一下代码便可以实现listitem级别的权限系统.

使用代码为sharepoint/MOSS设置Item级的权限,代码如下:
publicstringItemPermission(stringSitePath)
    {
        stringReturnVal ="";
        try
        {
            SPSite WebApp =newSPSite(SitePath);
            SPWeb Site =WebApp.OpenWeb();
            SPList list =Site.Lists["TestDocLib"];
            SPListItem item =list.Items[0];
            SPRoleDefinition RoleDefinition =Site.RoleDefinitions.GetByType(SPRoleType.Contributor);
            SPRoleAssignment RoleAssignment =newSPRoleAssignment("<domain>\\<user>", "email", "name", "notes");
            RoleAssignment.RoleDefinitionBindings.Add(RoleDefinition);
            if(!item.HasUniqueRoleAssignments)
            {
                item.BreakRoleInheritance(true);                
            }
            item.RoleAssignments.Add(RoleAssignment);
            item.Update();
        }
        catch(Exception ex)
        {
            ReturnVal +="Permission not set, reason: "+ex.Message;
        }
        returnReturnVal;
    }

  item.BreakRoleInheritance(true);这句代码是精髓。

  好了,我们的需求很快的并且很好的得到了满足,不过先不要那么高兴,还有一个很重要的问题我们没有解决,那就是怎么转移权限。

  我们设置了item级别的权限,大家可以设想一下,要是在这个权限系统中,唯一的一个拥有修改权限的人离职了,其他人全部都是只读权限,天啦,我们公司因为一个人的离开损失多大啊。作为开发人员,我们必须在系统设立之初就解决掉这样的灾难性的问题。下面我提供了一个解决方案,来批量的转移我们的权限

usingSystem;
usingSystem.Web;
usingSystem.Web.Services;
usingSystem.Web.Services.Protocols;
usingMicrosoft.SharePoint;

[WebService(Namespace ="http://tempuri.org/")]
[WebServiceBinding(ConformsTo =WsiProfiles.BasicProfile1_1)]
publicclassService : System.Web.Services.WebService
{
    publicService () {

//Uncomment the following line if using designed components 
        //InitializeComponent(); 
}

[WebMethod]
    publicstringItemPermission(stringSitePath, stringLibName, stringOldUser, stringNewUser, stringemail, stringname)
    {

stringReturnVal ="";

try
        {
            SPSite WebApp =newSPSite(SitePath);
            SPWeb Site =WebApp.OpenWeb();
            SPList list =Site.Lists[LibName];
            SPQuery newSPQuery =newSPQuery();
            newSPQuery.Query ="<Where><Eq><FieldRef Name=\"Author\"/><Value Type=\"User\">"+OldUser +"</Value></Eq></Where>";
            SPListItemCollection listItemCol =list.GetItems(newSPQuery);
            if(listItemCol.Count >0)
            {
                foreach(SPListItem item inlistItemCol)
                {
                    SPRoleDefinition RoleDefinition =Site.RoleDefinitions.GetByType(SPRoleType.Contributor);
                    SPRoleAssignment RoleAssignment =newSPRoleAssignment(NewUser, email, name, "notes");
                    RoleAssignment.RoleDefinitionBindings.Add(RoleDefinition);
                    if(!item.HasUniqueRoleAssignments)
                    {
                        item.BreakRoleInheritance(true);
                    }
                    item.RoleAssignments.Add(RoleAssignment);
                    item.Update();
                }
            }
        }
        catch(Exception ex)
        {
            ReturnVal +="Permission not set, reason: "+ex.Message;
        }
        returnReturnVal;
    }
    
}

如何使用?

下面展示一个控制台程序,讲述如何使用这个webservice

替换下面的字符串

<sitepath> with the Full URL of the site

<libname> with the list/library name

<domain> with the domain name

<olduser> with the userid who left the company

<newuser> with the userid to whom you want to give permission

<email of new user> self explaning

<name of new user> self explaning

If "<domain>\\<olduser>" does not work try to use the old user’s full name such as “John Smith”.

=====================================================

using System;

using System.Collections.Generic;

using System.Text;

namespace ConsoleApplication1

{

class Program

{

//localhost.Service newService;

static void Main(string[] args)

{

localhost.Service newService = new localhost.Service();

newService.UseDefaultCredentials = true; //I am assuming an administrator/power user is running this app or use a specific credential here

string output = newService.ItemPermission("<sitepath>", "<libname>", "<domain>\\<olduser>", "<domain>\\<newuser>","<email of new user>", "<name of new user>");

Console.WriteLine(output);

Console.ReadLine();

}

}

}

  注意:本文介绍的所有代码都与用户是紧耦合的,也就是说用户是死定在代码里面的,如果真的要满足现实需求,必须解除这个耦合,MOSS/Sharepoint 控制视图页面访问权限开发的问题(代码法) 这篇文章是一个例子,你可以使用相同的方法,建立一个列表,这样用户的耦合性就被降低了,可以由客户自己定制。

直接给item增加权限,例如编辑权限

item.DoesUserHavePermissions(SPBasePermissions.RditListItems)

还有一个例子是我从网上找的:

PSite site = listEvent.Site;
SPWeb web = site.OpenWeb();
string urlVal = listEvent.WebUrl + "/" + listEvent.UrlAfter;
SPFile file = web.GetFile(listEvent.UrlAfter);
while (file.CheckOutStatus != SPFile.SPCheckOutStatus.None)
{file = web.GetFile(listEvent.UrlAfter);
}
SPListItem myItem = file.Item;//取消继承
if (!myItem.HasUniqueRoleAssignments)myItem.BreakRoleInheritance(true);
//清除权限
foreach (SPRoleAssignment roleAssignment in myItem.RoleAssignments)
{roleAssignment.RoleDefinitionBindings.RemoveAll();roleAssignment.Update();
}SPGroup groupAdmin = web.SiteGroups["项目管理系统管理员"];SPRoleDefinition RoleDefContributor = web.RoleDefinitions.GetByType(SPRoleType.Contributor);
SPRoleDefinition RoleDefAdministrator = web.RoleDefinitions.GetByType(SPRoleType.Administrator);SPRoleAssignment RoleAssAdmin = new SPRoleAssignment((SPPrincipal)groupAdmin);
SPRoleAssignment RoleAssAuthor = new SPRoleAssignment((SPPrincipal)file.Author);RoleAssAdmin.RoleDefinitionBindings.Add(RoleDefAdministrator);
RoleAssAuthor.RoleDefinitionBindings.Add(RoleDefContributor);
//重新分配权限
myItem.RoleAssignments.Add(RoleAssAdmin);
myItem.Update();
myItem.RoleAssignments.Add(RoleAssAuthor);myItem.Update();using(SPWeb oParentWebsite = SPContext.Current.Site.AllWebs["Site_Name"])
{SPWebCollection collWebsites = oParentWebsite.Webs;SPUser oUser = oParentWebsite.Users["User_Name"];foreach (SPWeb oWebsite in collWebsites){SPRole oRole = oWebsite.Roles["Role_Name"];oRole.RemoveUser(oUser);oWebsite.Dispose();}
}

转载:http://www.cnblogs.com/Creator/archive/2010/12/21/1909393.html

转载于:https://www.cnblogs.com/EricLee007/archive/2012/06/07/2540545.html

使用代码设置Item级的权限(权限总结1)相关推荐

  1. 【Android RTMP】Android Camera 视频数据采集预览 ( 图像传感器方向设置 | Camera 使用流程 | 动态权限申请 )

    文章目录 安卓直播推流专栏博客总结 一. Camera 传感器方向简介 二. Camera 图像传感器横向显示数据 三. Camera 图像传感器纵向显示数据 四. 设置 Camera 预览数据方向 ...

  2. python开发信息系统权限设置_[Python学习] Django 权限控制

    本文为大家讲解 Django 框架里自带的权限模型,从理论到实战演练,带领大家了解 Django 里权限是怎么一回事. 主要内容 什么是权限管理? Web 权限 Django 权限机制 Django ...

  3. Hack The Box - Catch 利用let chat API查询信息,Cachet配置泄露漏洞获取ssh登录密码,apk代码注入漏洞利用获取root权限

    Hack The Box-Catch Hack The Box开始使用流程看这篇 文章目录 Hack The Box-Catch 整体思路 1.Nmap扫描 2.apk文件信息收集 3.lets ch ...

  4. Deepin中设置文件或文件夹权限

    Deepin中设置文件或文件夹权限 -R 递归进行某项操作,不论是删除文件夹或者修改文件夹下所有文件权限 权限更改,777相当于完全控制权限: 更改一个文件夹或文件的权限:chmod 777 文件路径 ...

  5. arcgis server账号需要设置地图缓存的访问权限

    如果gis服务起不来,那么可以看看arcgis server账号有没有设置地图缓存的访问权限,有可能arcgis server账号没有这个文件夹的访问权限.  本文用菊子曰发布 转载于:https:/ ...

  6. Win10 + VSCode踩坑 + vue项目开发:设置vscode终端为管理员权限

    win10系统 如何设置vscode的终端为管理员权限? 一次一次的授权太麻烦! 这里直接更改授权为管理员运行即可. 操作与设置步骤: "桌面找到"VSCode"程序图标 ...

  7. php论坛权限设置,php – 如何实现论坛权限

    您描述的方法 – 存储在列中的各个权限 – 是以直接的方式牺牲灵活性(如您所注意到的). Zuul的方法更简单,与您的方法基本相同,只是它避免了任何"ALTER TABLE"语句的 ...

  8. 虚拟服务器ftp上传权限设置,13. 为 FTP虚拟用户设置“不同文件目录”和“访问权限”...

    Re:FTP 文件传输服务 ========================== FTP 服务不论在企业或教学中,是很常用的文件共享方式,它既可以做到匿名访问,也可以做到用户名和密码访问,更可以做到只 ...

  9. python访问带密码的共享文件夹_设置带密码和读写权限的共享文件夹 - Hakka

    目录导航 1.启用网络发现和密码访问共享 1.1 使用组合键"Win+R"打开运行窗口,输入"control"打开控制面板 1.2 在控制面板中,点击" ...

最新文章

  1. 如何使用Web Audio API听到“ Yanny”和“ Laurel”的声音
  2. 用Scrum敏捷开发工具Leangoo做Sprint迭代管理
  3. php url 删除参数错误,为什么在通过改型2按id删除数据时会出现IllegalArgumentException错误?以及如何修复它...
  4. iOS之UI--涂鸦画板实例
  5. java 重写set方法_Java程序设计-方法的重写(override)(笔记)
  6. 风险案例-25期-与有过合作经历客户在新合同约定中过于简单、范围不明确,导致客户对新需求工作量不认可...
  7. C语言与sqlserver数据库
  8. 通过mod_limitipconn模块来限制apache的并发连接数
  9. perl 安装html,centos perl 安装HTML-Parser时报错
  10. redis查询key的数量
  11. 检测php常量是否存在,php判断变量常量是否存在
  12. android 字母索引三方,Android 字母索引动态自定义布局
  13. window7 64位 myeclipse9.0破解步骤
  14. 用单片机测量流体流速的_沟渠流量测量系统宝山哪家质量好广州顺仪品牌
  15. 2015推荐的Android框架
  16. numpy库的下载与应用
  17. Python全栈工程师特训班第四期-直播回放-CSDN就业班-专题视频课程
  18. USB数据采集卡,通过树莓派微型电脑,实现高速以太网数据采集
  19. 提高计算机性能的主流方法,提高cpu性能的方法有哪些?怎么把电脑cpu性能调到最大?...
  20. drawio 二次开发

热门文章

  1. Codeforce-Ozon Tech Challenge 2020-C. Kuroni and Impossible Calculation(鸽笼原理)
  2. 数据结构--链式栈--C++实现
  3. 简单谈谈5G/C-V2X技术与自动驾驶的关系
  4. leetcode刷题 15.三数之和
  5. Nginx+Tomcat+Memcached实现tomcat集群和session共享
  6. 【Transformer】CrossFormer:A versatile vision transformer based on cross-scale attention
  7. 数组和lookup函数
  8. 理解 Glance - 每天5分钟玩转 OpenStack(20)
  9. 怎么避免UpdateData()函数弹出对话框
  10. missing legacy device support