2011-10-19 32 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で発生したオブジェクト "です。

私はいくつかのグーグルを行い、このフォーラムの投稿http://social.msdn.microsoft.com/forums/en-US/sharepointdevelopment/thread/32869ac6-4f47-46b8-accf-f56966ac9581が自分のコードを修正するように導いてくれました。私はをSPSecurity.RunWithElevatedPrivilegesを呼び出した後の最初のコード行にして、すべてが機能し始めました。問題を取り除く私はSystem.Web.HttpContext.Currentまだあなたの非上昇したアカウントへの接続を持っているを読んだから、それをnullに設定することにより、

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

だから私のコードは次のようなもの(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; 
    } 
私は許可法の下に、この方法を掲載しました
関連する問題