2011-10-19 4 views
1

문서 라이브러리의 폴더에서 SPListItem 사용 권한을 조작하려고하지만 보안 상속을 제거하는 것이 아름답게 작동하지만 새로운 사용 권한을 추가 할 수 없습니다.SharePoint RoleAssignment가 추가되지 않음

테스트 목적으로 코드의 슬림화 된 버전을 만들기 위해 최선을 다했습니다. GetListItem 함수는 URL을 기반으로 작업중인 SPListItem을 반환합니다. item.BreakRoleInheritance(False) 잘 작동하고 제대로 상속을 확인하고 모든 사용 권한을 지우고, 나는 또한 True 플래그로 시도하고 모든 원래 사용 권한이 부모로부터 복사 된 것을 확인했습니다.

아래의 코드는 예외를 발생시키지 않으며 내 문서 라이브러리의 폴더에 대한 실제 사용 권한을 확인하고 "뷰어"가 표시되지 않을 때까지 제대로 작동하는 것처럼 보입니다.

코드 :

Dim item As SPListItem = GetListItem(URL) 

    If item Is Nothing Then 
     Exit Sub 
    End If 

    Dim spGrp = SharePointWeb.SiteGroups("Viewers") 
    Dim spRole As SPRoleDefinition = SharePointWeb.RoleDefinitions("Read") 

    Dim roleAssignment As New SPRoleAssignment(spGrp) 
    roleAssignment.RoleDefinitionBindings.Add(spRole) 

    SharePointWeb.AllowUnsafeUpdates = True 

    item.BreakRoleInheritance(False) 
    item.RoleAssignments.Add(roleAssignment) 
    item.Update() 

    SharePointWeb.AllowUnsafeUpdates = False 

나는 SPSecurity.RunWithElevatedPrivileges에 대한 호출이 코드를 포장 시도했지만 그것은 어떤 차이가 없었다. 내 SPSite/SPWeb 개체의 생성은 SPSecurity.RunWithElevatedPrivileges에 대한 호출로 래핑되며 폴더/etc ...에있는 기존의 코드로 찾기/삭제/업데이트 특성을 실행하는 다른 코드가 있습니다. 단지 권한이 작동하기를 원치 않습니다.

참고 :
- http://moldenco.blogspot.com/2007/05/spsecurityrunwithelevatedprivileges-to.html
- How to give an SPGroup permissions for an SPItem?
- http://blogs.msdn.com/b/joelo/archive/2007/10/05/sharepoint-roles-assignments.aspx

답변

0

문제를 연구하고 나는 예외에 걸쳐 일어난 다른 방법의 veriety 노력을 통해은 "작업으로 인해의 현재 상태에 유효하지 않습니다 개체 "SPWebEnsureSPControl에서 발생했습니다.

Google 검색을 수행하여이 포럼 게시물 http://social.msdn.microsoft.com/forums/en-US/sharepointdevelopment/thread/32869ac6-4f47-46b8-accf-f56966ac9581이 내 코드 수정을 이끌어 냈습니다. 나는 System.Web.HttpContext.Current = Nothing 코드를 호출하여 SPSecurity.RunWithElevatedPrivileges을 호출하고 모든 것이 작동하기 시작했다. 문제의 못된 내가 System.Web.HttpContext.Current 여전히 비 상승 계정에 연결이 읽을 무엇에서 그것을 null로 설정하여

SPSecurity.RunWithElevatedPrivileges(Sub() 
              System.Web.HttpContext.Current = Nothing 
              ........ 
             End Sub) 

:

그래서 내 코드는 같은 (AN anonomous 대리자를 사용)를 찾습니다 .

0

이렇게 해보십시오. 권한으로 인해 이러한 방법에 여전히 문제가있는 경우 승격 된 권한을 사용하지 말고 가장을 사용하십시오.

public static void SetPermissions(SPListItem item, IEnumerable<SPPrincipal> principals) 
     { 
      try 
      { 
       if (item != null) 
       { 
        foreach (SPPrincipal principal in principals) 
        { 
         SPRoleDefinition roleDefinition = item.Web.RoleDefinitions[Constants.SiteCollection.SecurityTypeNames.contribute]; 
         SetPermissions(item, principal, roleDefinition); 
        } 
       } 
      } 
      catch (SPException exc) 
      { 
       //catch exception 
      } 
     } 

     /// <summary> 
     /// setpermissions method for one group 
     /// </summary> 
     /// <param name="item"></param> 
     /// <param name="principal"></param> 
     /// <param name="roleType"></param> 
     public static void SetPermissions(SPListItem item, SPPrincipal principal) 
     { 
      if (item != null) 
      { 
       SPRoleDefinition roleDefinition = item.Web.RoleDefinitions[Constants.SiteCollection.SecurityTypeNames.contribute]; 
       SetPermissions(item, principal, roleDefinition); 
      } 
     } 

     /// <summary> 
     /// permission setting method used by previous two setpermissions method 
     /// </summary> 
     /// <param name="item"></param> 
     /// <param name="principal"></param> 
     /// <param name="roleDefinition"></param> 
     public static void SetPermissions(SPListItem item, SPPrincipal principal, SPRoleDefinition roleDefinition) 
     { 

      if (item != null) 
      { 
       item.Web.AllowUnsafeUpdates = true; 

       SPRoleAssignment roleAssignment = new SPRoleAssignment(principal); 
       roleAssignment.RoleDefinitionBindings.Add(roleDefinition); 
       item.RoleAssignments.Add(roleAssignment); 

       item.Web.AllowUnsafeUpdates = false; 
      } 

     } 

가장 방법 :

public static SPWeb GetImpersonatedWeb(SPSite impSite, string impWebUrl) 
     { 
     ILogger logger = SharePointServiceLocator.GetCurrent().GetInstance<ILogger>(); 

     try 
     { 
      SPUserToken systoken = impSite.SystemAccount.UserToken; 
      using (SPSite site = new SPSite(impSite.Url, systoken)) 
      { 
       SPWeb web = site.AllWebs[GetServerRelUrlFromFullUrl(impWebUrl)]; 
       return web; 
      } 
     } 
     catch (SPException exc) 
     { 
      //catch exception 
     } 
    } 

    public static SPSite GetImpersonatedSite() 
    { 
     try 
     { 
      SPSite impSite = SPContext.Current.Site; 

      SPUserToken systoken = impSite.SystemAccount.UserToken; 
      SPSite site = new SPSite(impSite.Url, systoken); 
      return site; 
     } 
     catch (SPException exc) 
     { 
      //catch exception 
     } 
    } 

public static string GetServerRelUrlFromFullUrl(string url) 
     { 
     int index = url.IndexOf("//"); 
     if ((index < 0) || (index == (url.Length - 2))) 
     { 
      throw new ArgumentException(); 
     } 
     int startIndex = url.IndexOf('/', index + 2); 
     if (startIndex < 0) 
     { 
      return "/"; 
     } 
     string str = url.Substring(startIndex); 
     if (str.IndexOf("?") >= 0) 
      str = str.Substring(0, str.IndexOf("?")); 

     if (str.IndexOf(".aspx") > 0) 
      str = str.Substring(0, str.LastIndexOf("/")); 

     if ((str.Length > 1) && (str[str.Length - 1] == '/')) 
     { 
      return str.Substring(0, str.Length - 1); 
     } 
     return str; 
    } 
나는 허가 방법보다이 방법을 게시
관련 문제