日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/13 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用代码设置Item级的权限(权限总结1) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。