2009-07-30 53 views

回答

0

我認爲沒有辦法通過開箱即用的Web服務來實現這一點。然而,您可以編寫Web服務,將其部署到您的SharePoint服務器場,然後調用該服務。

在它應該是一個方法,需要一個用戶名,然後使用SPSecurity.RunWithElevatedPriviliges循環通過網站集/網站,以確定是否提供的用戶有權訪問每個。

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 
5

如果你要使用的API,而不是那麼我會建議你做以下返回所有當前用戶的子站點,而不必使用提升的特權時。

using(SPSite site = new SPSite("http://example/site/")) 
{ 
    using (SPWeb web = site.OpenWeb()) 
    { 
     SPWebCollection webCollection = web.GetSubwebsForCurrentUser(); 
    } 
} 
0

尋找類似的解決方案,我在CodePlex上遇到SharePoint SUSHI。我還沒有嘗試過,但它看起來會做你想要的。或者如果你真的想自己寫,你可以看看代碼,看看他們是如何做的。

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

0

使用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())); 
} 
相關問題