C# 如何从windows应用程序检索用户有权访问的sharepoint网站列表

C# 如何从windows应用程序检索用户有权访问的sharepoint网站列表,c#,sharepoint,C#,Sharepoint,我需要检索通过windows应用程序(C#)访问的所有SharePoint网站的列表。我计划使用SharePoint web services 任何使用SharePoint web services的指针都可以为我提供所需的信息吗?我认为开箱即用的web services无法做到这一点。但是,您可以编写web服务,将其部署到sharepoint场,然后调用该服务 在这种情况下,应该有一种方法,该方法采用用户名,然后使用SPSecurity.RunWithElevatedPriviliges循环浏

我需要检索通过windows应用程序(C#)访问的所有SharePoint网站的列表。我计划使用SharePoint web services


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

我认为开箱即用的web services无法做到这一点。但是,您可以编写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
Dim rootNode作为XmlNode=Nothing
使用ws作为新的WebProxy.Webs
ws.PreAuthenticate=True
ws.UseDefaultCredentials=True
ws.Url=+“/\u vti\u bin/webs.asmx”
rootNode=ws.GetWebCollection()
终端使用

如果您想使用API,那么我建议您执行以下操作,为当前用户返回所有子网站,而不必使用提升权限

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

为了寻找类似的解决方案,我在CodePlex上遇到了。我还没试过,但它看起来能满足你的需求。或者,如果你真的想自己写,你可以查看代码,看看他们是怎么做的。

我知道这个问题很老了,但因为它仍然是第一个/唯一的结果之一,我想我会分享我发现的使用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
,但这有点复杂。可以在此处找到更多信息:

使用SharePoint.NET SDK,我可以通过发送对
WebTemplate:GROUP
关键字的查询来获取登录用户有权访问的所有站点

以下是我针对SharePoint online(在撰写本文时称为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()));
}