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

SharePoint权限管理
本文详细介绍如何在SharePoint中为特定文件或列表项设置独立的权限,包括打破权限继承、为列表项设置特定权限及批量转移权限的方法。同时,提供了实用的代码示例,帮助开发者理解和实现细粒度的权限控制。

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级的权限,代码如下:
public   string  ItemPermission( string  SitePath)
    {
         string  ReturnVal  =   "" ;
         try
        {
            SPSite WebApp  =   new  SPSite(SitePath);
            SPWeb Site  =  WebApp.OpenWeb();
            SPList list  =  Site.Lists[ " TestDocLib " ];
            SPListItem item  =  list.Items[ 0 ];
            SPRoleDefinition RoleDefinition  =  Site.RoleDefinitions.GetByType(SPRoleType.Contributor);
            SPRoleAssignment RoleAssignment  =   new  SPRoleAssignment( " <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;
        }
         return  ReturnVal;
    }
复制代码

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

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

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

复制代码
using  System;
using  System.Web;
using  System.Web.Services;
using  System.Web.Services.Protocols;
using  Microsoft.SharePoint;
 

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

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

    [WebMethod]
     public   string  ItemPermission( string  SitePath,  string  LibName,  string  OldUser,  string  NewUser,  string  email,  string  name)
    {
 

         string  ReturnVal  =   "" ;
 

         try
        {
            SPSite WebApp  =   new  SPSite(SitePath);
            SPWeb Site  =  WebApp.OpenWeb();
            SPList list  =  Site.Lists[LibName];
            SPQuery newSPQuery  =   new  SPQuery();
            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  in  listItemCol)
                {
                    SPRoleDefinition RoleDefinition  =  Site.RoleDefinitions.GetByType(SPRoleType.Contributor);
                    SPRoleAssignment RoleAssignment  =   new  SPRoleAssignment(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;
        }
         return  ReturnVal;
    }
    
}
复制代码

 

 如何使用?

下面展示一个控制台程序,讲述如何使用这个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

在 Windows BAT 脚本中复制二文件夹中的文件时遇到“权限不足”(Permission Denied)问题,通常与用户账户权限、目标路径访问控制、或脚本执行环境有关。以下是针对此类问题的详细解决方案: ### 使用管理员权限运行批处理脚本 在标准用户权限下,某些系统路径或受保护目录可能无法被访问或修改。为解决此问题,可以在运行脚本时提升权限: - 创建快捷方式指向 `.bat` 文件,右键选择 **“属性”**,点击 **“快捷方式”** 选项卡下的 **“高”**,勾选 **“以管理员身份运行”**。 - 或者在脚本开头添加如下代码,尝试自动请求管理员权限: ```bat :: 检查是否以管理员身份运行 %1 %2 ver|findstr /c:"5.1." >nul && setlocal enabledelayedexpansion if '%1'=='UAC' goto :UAC mshta vbscript:createobject("shell.application").shellexecute("%~s0","UAC","","runas",1)(window.close)&exit :UAC cd /d "%~dp0" ``` 此段代码会检测当前脚本是否以管理员权限运行,若否,则尝试重新启动脚本并请求权限提升[^1]。 ### 修改目标路径的访问控制权限 若目标路径(如共享文件夹或受保护目录)设置了严格的访问控制列表(ACL),需手动调整权限设置: - 右键点击目标文件夹,选择 **“属性” → “安全” → “编辑”**。 - 选择当前用户账户,勾选 **“完全控制”** 权限。 - 确认更改后再次执行复制操作。 ### 使用 `xcopy` 替代 `copy` 命令 `xcopy` 命令支持递归复制和更精细的控制选项,适用于复制包含子文件夹的目录结构。例如: ```bat xcopy /s /y "..\rootFolder\subfolder" "\\172.16.1.1\sharefolder\" /EXCLUDE:exclude.txt ``` 此命令会复制 `subfolder` 中所有内容(包括子文件夹),但排除 `exclude.txt` 中指定的文件或目录。注意,`subfolder` 后不加斜杠 `\`,而目标路径需以斜杠结尾。 ### 设置临时变量简化路径引用 在脚本中使用变量可以提高可读性和维护性。例如: ```bat set source=..\rootFolder\subfolder set target=\\172.16.1.1\sharefolder\ xcopy /s /y "%source%" "%target%" /EXCLUDE:exclude.txt ``` ### 检查共享路径的访问权限 若目标路径为网络共享目录,需确保当前用户在远程主机上有足够的访问权限: - 确认远程主机上共享文件夹的权限设置允许当前用户进行写入操作。 - 若使用不同账户访问共享路径,可通过 `net use` 命令映射网络驱动器并指定凭据: ```bat net use Z: \\172.16.1.1\sharefolder\ /user:username password xcopy /s /y "..\rootFolder\subfolder" "Z:\" ``` ### 使用 PowerShell 命令增强权限处理 PowerShell 提供了更强的权限管理能力,可作为替代方案嵌入 BAT 脚本中执行复制操作: ```bat powershell -Command "Copy-Item -Path '..\rootFolder\subfolder\*' -Destination '\\172.16.1.1\sharefolder\' -Recurse -Force" ``` 该命令使用 `-Force` 参数可绕过只读属性,增强对受保护文件的复制能力。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值