如何从Windows应用程序中检索用户有权访问的sharepoint站点列表

时间:2009-07-30 07:49:05

标签: c# sharepoint

我需要通过Windows应用程序(C#)检索我可以访问的所有SharePoint站点的列表。我打算使用SharePoint Web服务。

使用SharePoint Web服务的任何指针都可以为我提供所需的信息吗?

6 个答案:

答案 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。我还没试过,但看起来它会做你想要的。或者,如果你真的想自己写,你可以查看代码,看看他们是如何做的。