我需要通过Windows应用程序(C#)检索我可以访问的所有SharePoint站点的列表。我打算使用SharePoint Web服务。
使用SharePoint Web服务的任何指针都可以为我提供所需的信息吗?
答案 0 :(得分:5)
如果您想使用API,那么我建议您执行以下操作以返回当前用户的所有子网站,而无需使用提升的权限。
using(SPSite site = new SPSite("http://example/site/"))
{
using (SPWeb web = site.OpenWeb())
{
SPWebCollection webCollection = web.GetSubwebsForCurrentUser();
}
}
答案 1 :(得分:3)
Webs.asmx应该可以解决这个问题。这是一个让你入门的片段。
Dim rootNode As XmlNode = Nothing
Using ws As New WebsProxy.Webs
ws.PreAuthenticate = True
ws.UseDefaultCredentials = True
ws.Url = <site collection address> + "/_vti_bin/webs.asmx"
rootNode = ws.GetWebCollection()
End Using
答案 2 :(得分:1)
我知道这个问题真的很老,但由于它仍然是我认为我会分享解决方案的第一个/唯一结果之一,我发现使用SharePoint搜索来解决问题。它不仅非常快,您可以根据自己的喜好调整查询,甚至可以创建自定义搜索范围来限制结果。
string queryText = "SELECT url, title " +
"FROM Scope() " +
"WHERE \"Scope\" = 'All Sites' " +
"AND (ContentClass = 'STS_Site' OR ContentClass = 'STS_Web')";
SearchServiceApplicationProxy proxy = (SearchServiceApplicationProxy)SearchServiceApplicationProxy.GetProxy(SPServiceContext.GetContext(SPContext.Current.Site));
FullTextSqlQuery searchQuery = new FullTextSqlQuery(proxy);
searchQuery.ResultsProvider = SearchProvider.Default;
searchQuery.ResultTypes = ResultType.RelevantResults;
searchQuery.EnableStemming = false;
searchQuery.TrimDuplicates = true;
searchQuery.QueryText = queryText;
searchQuery.RowLimit = 1000;
ResultTableCollection results = searchQuery.Execute();
ResultTable result = results[ResultType.RelevantResults];
while (result.Read())
{
string url = result.GetString(0);
string title = result.GetString(1);
...
}
上面的查询也可以传递给/vti_bin/search.asmx
,但这有点复杂。更多信息可以在这里找到:http://msdn.microsoft.com/en-us/library/ee872313.aspx
答案 3 :(得分:1)
使用SharePoint .NET SDK,我可以通过针对WebTemplate:GROUP
关键字发送查询来提取登录用户有权访问的所有网站。
以下是我在线反对SharePoint的工作示例(撰写本文时称为Office 365 SharePoint):
using Microsoft.SharePoint.Client;
using Microsoft.SharePoint.Client.Search.Query;
// Connection to SharePoint.
var context = new ClientContext(url);
var securePassword = new System.Security.SecureString();
foreach (var c in password.ToCharArray())
{
securePassword.AppendChar(c);
}
context.Credentials = new SharePointOnlineCredentials(username, securePassword);
// Pull sites the user has access to.
var query = new KeywordQuery(context);
query.QueryText = "WebTemplate:GROUP";
query.SelectProperties.Add("Title");
query.SelectProperties.Add("Path");
query.RowsPerPage = 1000;
var results = new SearchExecutor(context).ExecuteQuery(query);
context.ExecuteQuery();
// Process results...
// (May want to add some error/null condition checks.)
var resultTable = results.Value.First();
foreach (var result in resultTable.ResultRows)
{
Console.WriteLine(string.Format("Title: {0} -- Path: {1}",
result["Title"].ToString(),
result["Path"].ToString()));
}
答案 4 :(得分:0)
我认为没有办法使用开箱即用的Web服务。但是,您可以编写Web服务,将其部署到sharepoint服务器场,然后再调用该服务。
它应该是一个方法,它接受用户名,然后使用SPSecurity.RunWithElevatedPriviliges循环通过网站集/网站来确定用户提供的是否有权访问每个用户。
答案 5 :(得分:0)
寻找类似的解决方案,我在CodePlex上遇到了SharePoint SUSHI。我还没试过,但看起来它会做你想要的。或者,如果你真的想自己写,你可以查看代码,看看他们是如何做的。