我正在开发一个C#代码,用于从On-Premise Sharepoint 2013服务器检索所有网站集路径。我在服务器上有以下网站集:
/ SERVERURL /
/ SERVERURL /我
/ SERVERURL /我/个人/ site1的
/ SERVERURL /我/个人/站点2
/ SERVERURL /网站/测试网站
/ SERVERURL / custompath / site3
当我运行我的代码时,我只获得以下网站集:
/ SERVERURL /
/ SERVERURL /我
/ SERVERURL /我/个人/ site1的
/ SERVERURL /我/个人/站点2
我想知道为什么我的搜索没有返回所有的网站集?
这是我的代码:
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);
}
谢谢!
答案 0 :(得分:1)
我今天遇到了同样的问题。我找到了两个解决方案。
无论您是在本地还是在Office365上,我们都可以使用Microsoft.Online.SharePoint.Client.Tenant dll。您可以使用它来获取所有网站集。如果你在本地,你需要你的管理员运行一些电源shell。 Vesa很乐意写一篇关于它的博客here
完成后,您可以执行以下操作(注意:我没有使用非管理员帐户测试此方法)(解决方案取自here)遗憾的是,这个方法对我不起作用我想要安全修整,这将代码必须由具有租户读取权限的用户运行,我们的用户通常不会这样做。
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
设置为假,我不知道为什么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();
希望其中一个能为你效劳。