Windowsアプリケーション(C#)からアクセスできるすべてのSharePointサイトのリストを取得する必要があります。 SharePoint Webサービスを使用する予定です。WindowsアプリケーションからアクセスできるSharePointサイトのリストを取得する方法
私に必要な情報を提供できるSharePoint Webサービスを使用しているポインタはありますか?
Windowsアプリケーション(C#)からアクセスできるすべてのSharePointサイトのリストを取得する必要があります。 SharePoint Webサービスを使用する予定です。Windowsアプリケーションからアクセスできる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を使用する場合、私はあなたが上昇priviligesを使用せずに、現在のユーザーのすべてのサブウェブを返すために、次の操作を行うことをお勧め。
using(SPSite site = new SPSite("http://example/site/"))
{
using (SPWeb web = site.OpenWeb())
{
SPWebCollection webCollection = web.GetSubwebsForCurrentUser();
}
}
同様の解決策を探して、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
SharePoint .NET SDKを使用して、WebTemplate:GROUP
キーワードに対してクエリを送信することで、ログインしているユーザーがアクセスできるすべてのサイトをプルすることができました。ここで
は(この記事の執筆時点でのOffice 365のSharePointと呼ばれる)は、オンラインの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()));
}