2011-04-12 44 views
7

我試圖檢索所有網站和子網站在SharePoint中,但我得到訪問被拒絕。Sharepoint c#檢索所有網站和子網站

我讀了關於使用GetSubwebsForCurrentUser()屬性,但我得到相同的消息。

我的代碼是下一個

  foreach (SPWebApplication webApp in SPWebService.ContentService.WebApplications) 
      {      
       foreach (SPSite siteCollection in webApp.Sites) 
       { 
        foreach(SPWeb web in siteCollection.RootWeb.GetSubwebsForCurrentUser()) 
        { 
         dropDownSite.Items.Add(web.Url); 
        } 


       } 
      } 

請我需要幫助!謝謝!

+0

此代碼從哪裏運行? Web部分?計時器工作?還有別的嗎? – 2011-04-12 15:42:26

+2

現在只需要一個[SharePoint堆棧交換站點](http://sharepoint.stackexchange.com/)。它的測試版,但你應該在那裏發佈(或主持人可以在那裏移動這個問題)。這將有助於該網站獲得更多的牽引力:) – pstrjds 2011-04-12 15:54:42

+0

您是否在尋找基於用戶上下文的網站列表?如果是的話,你這樣做只是爲了填充下拉列表?如果是這樣我建議portalsitemapprovider。此外,您的代碼將使每個網絡處於未處理狀態,導致每次運行 – 2011-04-12 18:21:45

回答

9

你可能需要調用SPSecurity.RunWithElevatedPrivileges(delegate())

,如果你願意,你可以做一個內聯委託,是這樣的:

SPSecurity.RunWithElevatedPrivileges(delegate() 
{ 
foreach (SPWebApplication webApp in SPWebService.ContentService.WebApplications) 
      {      
       foreach (SPSite siteCollection in webApp.Sites) 
       { 
        foreach(SPWeb web in siteCollection.RootWeb.GetSubwebsForCurrentUser()) 
        { 
         dropDownSite.Items.Add(web.Url); 
        } 


       } 
      } 
    }); 
+0

時發生大量內存泄漏,這正是我所需要的,非常感謝!很棒! – sergio 2011-04-13 07:14:55

+0

如果有效,請將我的帖子標記爲答案:)謝謝。 – 2011-04-18 17:14:45

1

只是爲了確保此代碼是否運行在託管Sharepoint門戶的服務器上?你正在運行什麼版本的Sharepoint?

此外,使用Sharepoint公開的Web服務有意義嗎? http://msdn.microsoft.com/en-us/library/aa979690(v=office.12).aspx

如果您在SP所在的服務器上運行此代碼,請確保您的憑據可以訪問SP。如果您從網站調用此功能,請確保您沒有以「匿名」身份運行。

總而言之,我認爲利用webservices是最簡單的方法。但請確保您擁有正確的權限,並且該用戶可以訪問(在SP配置中)該數據。

希望有幫助!

0

如果使用出現SPSite.AllWebs訪問被拒絕的消息! 只要當前用戶是網站集管理員,此聲明纔是正確的。

因此,對於所有用戶,此功能將獲得所有網站和子網站。

public static IEnumerable<SPWeb> DescendantSites(this SPWeb input) 
    { 
     foreach (SPWeb web in input.GetSubwebsForCurrentUser()) 
     { 
      yield return web; 
      foreach (var subnode in web.DescendantSites()) 
       yield return subnode; 
     } 
    }