2009-07-30 7 views

Répondre

0

Il n'y a aucun moyen de le faire avec les services Web prêts à l'emploi, je pense. Vous pouvez cependant écrire votre service Web, le déployer dans votre batterie de serveurs SharePoint, puis appeler ce service.

Dans ce devrait être une méthode qui prend un nom d'utilisateur, puis en utilisant SPSecurity.RunWithElevatedPriviliges boucles à travers les sites collections/sites pour déterminer si l'utilisateur fourni a accès à chacun.

3

Webs.asmx devrait faire l'affaire. Voici un extrait pour vous aider à démarrer.

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

Si vous voulez utiliser l'API plutôt, je vous suggère de faire ce qui suit pour retourner toutes les toiles de sous pour l'utilisateur en cours sans avoir à utiliser priviliges élevées.

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

En cherchant une solution similaire, je suis tombé sur SharePoint SUSHI sur CodePlex. Je ne l'ai pas encore essayé, mais on dirait que ça va faire ce que vous cherchez. Ou si vous voulez vraiment écrire le vôtre, vous pouvez consulter le code et voir comment ils le font.

1

Je sais que cette question est vraiment ancienne, mais comme c'est toujours l'un des premiers/seuls résultats, j'ai pensé que je partagerais la solution que j'ai trouvée qui utilise la recherche SharePoint pour résoudre le problème. Non seulement c'est vraiment rapide, vous pouvez modifier la requête à votre goût ou même créer une portée de recherche personnalisée pour limiter les résultats.

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); 

    ... 
} 

La requête ci-dessus peut également être transmis à /vti_bin/search.asmx, mais qui est un peu plus compliqué. Plus d'informations peuvent être trouvées ici: http://msdn.microsoft.com/en-us/library/ee872313.aspx

0

En utilisant le SDK SharePoint .NET, j'ai été en mesure de tirer tous les sites auxquels l'utilisateur connecté a accès en envoyant une requête contre le mot-clé WebTemplate:GROUP.

Voici mon exemple de travail contre SharePoint en ligne (au moment de cette écriture appelée 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())); 
} 
Questions connexes