我需要通過Windows應用程序(C#)檢索我可以訪問的所有SharePoint站點的列表。我打算使用SharePoint Web服務。如何從Windows應用程序檢索SharePoint用戶可訪問的SharePoint站點列表
任何使用SharePoint Web服務的指針可以爲我提供所需的信息?
我需要通過Windows應用程序(C#)檢索我可以訪問的所有SharePoint站點的列表。我打算使用SharePoint Web服務。如何從Windows應用程序檢索SharePoint用戶可訪問的SharePoint站點列表
任何使用SharePoint Web服務的指針可以爲我提供所需的信息?
我認爲沒有辦法通過開箱即用的Web服務來實現這一點。然而,您可以編寫Web服務,將其部署到您的SharePoint服務器場,然後調用該服務。
在它應該是一個方法,需要一個用戶名,然後使用SPSecurity.RunWithElevatedPriviliges循環通過網站集/網站,以確定是否提供的用戶有權訪問每個。
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
如果你要使用的API,而不是那麼我會建議你做以下返回所有當前用戶的子站點,而不必使用提升的特權時。
using(SPSite site = new SPSite("http://example/site/"))
{
using (SPWeb web = site.OpenWeb())
{
SPWebCollection webCollection = web.GetSubwebsForCurrentUser();
}
}
尋找類似的解決方案,我在CodePlex上遇到SharePoint SUSHI。我還沒有嘗試過,但它看起來會做你想要的。或者如果你真的想自己寫,你可以看看代碼,看看他們是如何做的。
我知道這個問題真的很舊,但由於它仍然是我認爲我會分享解決方案的第一/唯一結果之一,我發現它使用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
使用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()));
}