并非所有网站集都显示在结果中 - SharePoint 2013 通过 CSOM 搜索

本文关键字:SharePoint 2013 通过 搜索 CSOM 结果 网站 显示 | 更新日期: 2023-09-27 18:30:21

我正在处理一个 C# 代码,该代码从本地 SharePoint 2013 服务器检索所有网站集路径。服务器上有以下网站集:

/

服务器网址/
/serverurl/my
/serverurl/my/personal/site1
/serverurl/my/personal/site2
/serverurl/sites/testsite
/serverurl/custompath/site3

当我运行我的代码时,我只得到以下网站集:
/服务器网址/
/serverurl/my
/serverurl/my/personal/site1
/serverurl/my/personal/site2
我想知道为什么我的搜索没有返回所有网站集?
这是我的代码:

ClientContext context = new ClientContext(siteUrl);
var cred = new NetworkCredential(userName, password, domain);
context.Credentials = cred;
KeywordQuery query = new KeywordQuery(context);
query.QueryText = "contentclass:STS_Site";
SearchExecutor executor = new SearchExecutor(context);
query.TrimDuplicates = true;
var resultTable = executor.ExecuteQuery(query);
context.ExecuteQuery();
foreach (var row in resultTable.Value[0].ResultRows)
{
   string siteName = row["siteName"] as string;
   Console.WriteLine("Site Name: {0}", siteName);
}

谢谢!

并非所有网站集都显示在结果中 - SharePoint 2013 通过 CSOM 搜索

我今天遇到了同样的问题。我找到了两个解决方案。

无论你是在本地还是在Office365上,我们都可以使用Microsoft.Online.SharePoint.Client.Tenant dll。 您可以使用它来获取所有网站集。 如果你在本地,你确实需要你的管理员运行一些电源外壳。 Vesa 很好,可以在这里写一篇关于它的博客

完成此操作后,您可以执行以下操作(注意:I尚未使用非管理员帐户测试此方法)(解决方案从此处获取) 可悲的是,这对我来说不起作用,因为我想要安全修整,这将代码必须由具有租户读取权限的用户运行,而我们的用户通常不会拥有。

var tenant = new Tenant(clientContext);
SPOSitePropertiesEnumerable spp = tenant.GetSiteProperties(0, true);
clientContext.Load(spp);
clientContext.ExecuteQuery();
foreach(SiteProperties sp in spp)
{
    // you'll get your site collections here
}
我最终这样做了,回到

了使用搜索,我仍然有一个问题,我们有 500 多个网站/网站,所以我正在与我们的管理员合作,看看我们是否可以增加搜索可以返回的最大行数。但是,这里真正的秘密是TrimDuplicates设置为 false,我不知道为什么 SP 认为结果是骗子,但它显然是,所以将其设置为 false,您应该看到你所有的坐姿。

KeywordQuery query = new KeywordQuery(ctx);
query.QueryText = "contentclass:'"STS_Site'"";
query.RowLimit = 500;//max row limit is 500 for KeywordQuery
query.EnableStemming = true;
query.TrimDuplicates = false;
SearchExecutor searchExecutor = new SearchExecutor(ctx);
ClientResult<ResultTableCollection> results = searchExecutor.ExecuteQuery(query);
ctx.ExecuteQuery();
var data = results.Value.SelectMany(rs => rs.ResultRows.Select(r => r["Path"])).ToList();

希望两者之一对您有用。