Как получить список сайтов sharepoint, к которым пользователь имеет доступ, из приложения Windows - PullRequest
3 голосов
/ 30 июля 2009

Мне нужно получить список всех сайтов SharePoint, к которым у меня есть доступ через приложение Windows (C #). Я планирую использовать веб-службы SharePoint.

Какие-нибудь указатели, использующие веб-службы SharePoint, которые могут предоставить мне необходимую информацию?

Ответы [ 6 ]

5 голосов
/ 30 июля 2009

Если вы хотите использовать API вместо этого, я бы посоветовал вам сделать следующее, чтобы вернуть все вложенные веб-страницы для текущего пользователя без использования привилегированных привилегированных пользователей.

using(SPSite site = new SPSite("http://example/site/"))
{
    using (SPWeb web = site.OpenWeb())
    {
        SPWebCollection webCollection = web.GetSubwebsForCurrentUser();
    }
}
3 голосов
/ 30 июля 2009

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 голосов
/ 19 февраля 2013

Я знаю, что этот вопрос действительно старый, но, поскольку он по-прежнему является одним из первых / единственных результатов, я решил поделиться найденным решением, которое использует поиск 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

1 голос
/ 25 июля 2017

Используя 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()));
}
0 голосов
/ 17 февраля 2010

В поисках аналогичного решения я наткнулся на SharePoint SUSHI на CodePlex. Я еще не пробовал, но похоже, что он сделает то, что вы ищете. Или, если вы действительно хотите написать свой собственный, вы можете проверить код и посмотреть, как они это делают.

0 голосов
/ 30 июля 2009

Я думаю, что это невозможно сделать с помощью готовых веб-сервисов. Однако вы можете написать свой веб-сервис, развернуть его на своей ферме sharepoint и затем вызвать этот сервис.

В нем должен быть метод, который принимает имя пользователя и затем использует SPSecurity.RunWithElevatedPriviliges просматривает семейства сайтов / сайты, чтобы определить, имеет ли предоставленный пользователь доступ к каждому.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...