1

Webpart需要訪問Sharepoint列表(讀取模式)。如果用戶是管理員,沒有問題(按預期工作),但如果用戶沒有權限訪問,我必須使用「RunWithElevatedPrivileges」方法。帶有提升權限的Sharepoint查詢

問題是,似乎查詢不會返回正確的結果。我錯過了什麼?

 SPList demoList = null; 

     SPSecurity.RunWithElevatedPrivileges(delegate() 
     { 
      SPSite oSite = SPControl.GetContextSite(HttpContext.Current); // ADDED 
      SPWeb oWeb = oSite.OpenWeb();         // ADDED 
      demoList = oWeb.Lists["nameList"]; 
     }); 
     // demoList has 3 Elements (admin and no admin user) OK 

     SPListItemCollection collListItems = null; 

     SPSecurity.RunWithElevatedPrivileges(delegate() 
     { 
      SPQuery oQuery = new SPQuery() { Query = "<OrderBy><FieldRef Name='Date' Ascending='False' /></OrderBy>" }; 
      collListItems = demoList.GetItems(oQuery); 
     }); 

     // 
     //IF ADMIN 
     //collListItems.Count ==>3 

     //IF NO ADMIN 
     //collListItems.Count ==>0 

回答

6

您需要創建以提升privieges新對象。

SPSecurity.RunWithElevatedPrivileges(delegate() 
{ 
    SPSite oSite = new SPSite(SPContext.Current.Site.ID); 
    SPWeb oWeb = oSite.OpenWeb(SPContext.Current.Web.ID);         
    demoList = oWeb.Lists["nameList"]; 
}); 

此外,你應該處置新創建的對象,並且不需要兩個代表。

SPSecurity.RunWithElevatedPrivileges(delegate { 
    using (SPSite oSite =new SPSite(SPContext.Current.Site.ID)) 
    using (SPWeb oWeb = oSite.OpenWeb()) { 
     var demoList = oWeb.Lists["nameList"]; 
     SPQuery oQuery = new SPQuery 
          { Query = "<OrderBy><FieldRef Name='Date' Ascending='False' /></OrderBy>" }; 
     SPListItemCollection collListItems = demoList.GetItems(oQuery); 

     //IF ADMIN 
     //collListItems.Count ==>3 

     //IF NO ADMIN 
     //collListItems.Count ==>0 
    } 
}); 
+0

注意:RunWithElevatedPrivileges塊中的「泄漏」對象(如返回SPList)可能會導致無法使用的代碼或稍後意外提升權限。請確保不要將SPxxxx對象從傳遞給RunWithElevatedPrivileges的委託中退出(或者確保所有數據在對象中已經可用)。請注意,返回的LINQ查詢結果可能會延遲執行,直到稍後的時間點,並且結果在RunWithElevatedPrivileges調用之外執行SharePoint調用。 – 2011-05-18 21:44:34

4

如果您創建的網站和Web對象(或從當前SPContext訪問它們)高架塊外,他們將有當前登錄用戶的權限。因此,即使它位於高架塊中,您的查詢也不會使用提升的權限。您需要在提升塊內創建新的站點和Web對象,然後訪問列表,然後運行查詢以獲得預期結果。

這是一個資源,進一步解釋。即使它是SharePoint 2007的完成,它適用於SharePoint 2010的

與Windows SharePoint Services中提升權限運行命令3.0 http://msdn.microsoft.com/en-us/library/bb466220(v=office.12).aspx

+0

謝謝,但是,我添加了網站和SpWeb(代碼編輯了),但仍然無法正常工作。 – 2011-05-18 11:06:33

+0

您從上下文中獲取SPSite對象,因此它仍然附加了當前用戶的憑據。您需要新建一個才能獲得提升的權限。 – 2011-05-18 11:47:08

+0

另外需要注意的是,您要在一個塊中創建提升的SPList對象,然後在另一個塊中使用它。這可能有用(我從來沒有嘗試過),但我認爲將兩個高架塊組合成一個更好(如JWL所建議的)。 – 2011-05-18 11:57:35

0

如果你想在SharePoint列表寫操作,那麼之前RWEP方法添加SPWeb.ValidateFormDigest()SPUtility.ValidateFormDigest()線。

SPUtility.ValidateFormDigest(); 
SPSecurity.RunWithElevatedPrivileges(delegate() 
{ 

}