2016-04-13 10 views
0

SPSecurity.RunWithElevatedPrivilegesにコードを実行してもSPFolderを開こうとするとアクセス拒否エラーが表示されます。私はこのトピックに関するいくつかのポストを見つけ、私が見つけた解決策は:SPFolderのSharepointアクセスが拒否されました

  • RunWithElevatedPrivileges
  • 設定

SPSecurity.CatchAccessDeniedExceptionに何も作品内 SPContext.Current
  • インスタンス化アルSPObjectを使用しないでください私のために。

    SPFolder DocumentLibrary = web.Folders[Library]; 
    

    マイコード:

    bool originalCatchValue = SPSecurity.CatchAccessDeniedException; 
    SPSecurity.CatchAccessDeniedException = false; 
    
    try 
    { 
        string[] ArrayId = Request["arrayId"].ToString().Split('|'); 
        string company = Request["company"].ToString(); 
        string NewSPContext = company == "XXX" ? siteCollectionUrl.Replace("XXX", "") : siteCollectionUrl + "XXX"; 
        SPUserToken userToken = SPContext.Current.Web.CurrentUser.UserToken; 
        foreach (string id in ArrayId) 
        { 
         SPSecurity.RunWithElevatedPrivileges(delegate() 
         { 
          SPSite oSite = new SPSite(siteCollectionUrl, userToken); 
          SPWeb oWeb = oSite.OpenWeb(); 
          SPFile itemFile = FindListByName(oWeb, Library).GetItemById(int.Parse(id)).File; 
          using (SPSite site = new SPSite(NewSPContext, userToken)) 
          using (SPWeb web = site.OpenWeb()) 
          { 
           var test = web.CurrentUser; 
           web.AllowUnsafeUpdates = true; 
           SPFolder DocumentLibrary = web.Folders[Library]; 
           DocumentLibrary.Files.Add(itemFile.Item.Name, itemFile.OpenBinary(), itemFile.Properties, true); 
           DocumentLibrary.Update(); 
          } 
         }); 
        } 
        Response.Write("OK"); 
    } 
    finally 
    { 
        SPSecurity.CatchAccessDeniedException = originalCatchValue; 
    } 
    
  • +0

    タイトルを「解決済み」に変更しないでください。何らかの回答が問題を解決した場合は、それを回答とマークアップして感謝の気持ちを示し、(同様の問題を抱える他の人に)問題を解決したことを示します。 – Sufian

    答えて

    0

    あなたはSPSiteのクラスのコンストラクタにユーザートークンを提供する場合、作成されたインスタンスは、のコンテキストで実行されます私のコードに従って、エラーがで発生します指定されたユーザー。あなたのケースでは、oSiteオブジェクトで実行するすべての操作は、CurrentUserによって呼び出されているかのように実行されます。

    SPSiteオブジェクトをインスタンス化する行からuserトークンパラメータを削除するだけで、コードが権限を昇格した後に行けばよいはずです。

    あなたのコードには複数の問題があります。最小限に抑えるために、それは非常に非効率的であり、コードレビューに合格しません。ここではあなたのためにいくつかのヒントがあります:

    • はRunWithElevatedPrivileges関数への再帰呼び出しを避け、それは非常に高価な機能です。

    • ループ内で再帰的に再作成するのではなく、インスタンス化したSPSiteオブジェクトとSPWebオブジェクトを再利用してください。彼らは本当に建設するのに費用がかかります。

    • SPSiteオブジェクトとSPWebオブジェクトのすべてのインスタンスを破棄する必要があります。そうしないと、アプリケーションのパフォーマンスが時間の経過と共に低下し、最終的にクラッシュする可能性があるメモリリークが発生します。

    +0

    Serkanありがとうございます。私はコードが良くないことを知っています。問題を解決するために実験の途中で取ります。このコードでは、あるサイトから別のサイトにドキュメントをコピーしようとしていると述べています。現在のトークンを使用してサイトを開きます。これは、コピーしたドキュメントの作成者として現在のユーザーを2番目のサイトのユーザーに権限を与えずに持ちたい場合です。可能です? –

    +0

    現在のユーザーが両方の場所に十分なアクセス権を持っている限り、コードは実行コンテキストを上げなくてもうまく動作します。そうでない場合は、ファイルをターゲットサイトにアップロードした後、同じ関数呼び出しで、新しく作成されたドキュメントの[作成者]フィールドを現在のユーザーの名前で更新できます。これは、ドキュメントの元のメタデータを保存するための移行ツールによって一般的に行われていることです。だから、それは証明された解決策です... –