2009-02-20 109 views
2

嗨我正在使用SharePoint命名空間從整個站點的各種列表中提取項目。我的網站部分工作,但只在我的帳戶。當我在另一個帳戶上嘗試它時,它會爲我提供「錯誤:訪問被拒絕」頁面。我把所有的網頁部分都拿出來了,並且在網頁上只有這個網頁部分。當我刪除下面的行時,爲每個人加載頁面,當我將其添加回來,但它不起作用。我猜這是一些權限問題。我想知道是否有編程方式通過分配用戶ID使用查詢SharePoint上的不同列表?感謝您的幫助SharePoint開發權限

... 
SPSite site = new SPSite(_SPSite);   
SPWeb eachWeb = site.AllWebs[0]; 
SPListItemCollection myItemCollection = eachWeb.Lists["Listings"].Items; 
... 

回答

4

您是對的,當您使用的帳戶無法訪問當前網站中的「列表」列表時,訪問被拒絕錯誤發生。

解決這個問題的最簡單方法是使用SPSecurity.RunWithElevatedPrivleges電話:

SPSecurity.RunWithElevatedPrivleges(delegate() 
{ 
    //Your code here 
}); 

將運行任何代碼使用SharePoint /系統帳戶包含在匿名方法,授予完全控制。雖然使用這種技術時要小心,因爲它相當於以超級用戶帳戶完全信任地運行代碼。還有othercaveats也需要注意。

+0

Ahhh .... SharePoint開發。簡單的數據訪問會變得很麻煩。 – Jim 2009-02-20 19:22:50

+0

但這是一個「功能」!實際上,SharePoint API中的自動安全修整功能非常經常使用,但是有太多人在具有上帝特權的環境中開發和測試,並且想知道爲什麼在生產環境中爲匿名/低權限的帳戶打破了原因。 – 2009-02-20 20:48:03

0

嘗試:

SPWeb eachWeb = SPContext.Current.Site.RootWeb.Webs[0]; 
SPListItemCollection myItemCollection = eachWeb.Lists["Listings"].Items; 

記住的SPWeb應在using塊中使用,或使用後廢棄的明確。

0

由於從EvilGoatBob關於第一個警告,我引用:

「如果你在操縱你的高架方法中的任何對象模型元素,你需要得到這個裏面調用一個新的SPSite參考例如

。 。
SPSecurity.RunWithElevatedPrivileges(delegate(){ 
    SPSite mySite = new SPSite(http://sharepoint/); 
    SPWeb myWeb = SPSite.OpenWeb(); 
    // further implementation omitted 
});" 

注意,該網站的參數是硬編碼 - 這是因爲一個錯誤的如果你不是曾試圖:

使用(SPSite的網站=新的SPSite(「HTTP://」 +統環境.MachineName)){}

您會得到相當通用的「沒有SharePoint網站存在於指定的URL ...」錯誤。這使我無法結束悲痛。底線是,你必須硬編碼的服務器名稱(除非任何人有一個替代)。使用VSeWSS 1.3第一次調試Web部件時,您也可能會收到類似的錯誤消息。

0

需要硬編碼服務器名稱在這種情況下,因爲您的要求是檢索相同網站爲您的WebPart內從列表中的項目。你是正確的,如果你沒有足夠的權限與你的帳戶,那麼你會得到拒絕訪問。該解決方案是創建一個不同的安全環境中一個新的SPSite對象,並做你的工作:

SPSecurity.RunWithElevatedPrivileges(delegate() 
    { 
     using (SPSite site = new SPSite(SPContext.Current.Site.Url)) 
     { 
      using (SPWeb web = site.OpenWeb()) 
      { 
       //the web object was retrieved with elevated privileges under the system account. 

       //do your work here: 
       SPListItemCollection myItemCollection = web.Lists["Listings"].Items; 

       //... 
      } 
     } 
    } 
    ); 

通過上面的代碼,你的web部件是可移植的,因爲沒有硬編碼,並運行在正確的安全上下文而配置所有由SPSite和SPWeb構造函數創建的非託管SPRequest對象。