2011-04-12 41 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; 
     } 
    }