SharePointCommunity
Die deutschsprachige Community für SharePoint, Microsoft 365, Teams, Yammer und mit Azure

Sponsored by

Willkommen im Forum Archiv.
Einträge sind hier nicht mehr möglich, aber der Bestand von 12 Jahren SharePoint-Wissen ist hier recherchierbar.




Frage zur Site Collection Abfrage

Unbeantwortet Dieser Beitrag hat 12 Antworten

Ohne Rang
17 Beiträge
Matthias Baureis erstellt 3 Dez. 2013 10:03
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo,

ich habe eine Frage. Ich bin relativ neu im SharePoint Programmierung Umfeld. Ich wollte gerne mit C# alle Seiten aus einer bestehenden Farm auslesen, aber ich weiß nicht genau an welcher Stelle und wie ich den Code implementieren soll. Ich wäre sehr froh, wenn mir jemand eine Hilfestellung geben könnte.

Ich benutze Visual Studio 2013 mit SharePoint 2010

Der Code lautet wie folgt:

SPWebApplication webApplication = SPContext.Current.Site.WebApplication; SPSiteCollection siteCollections = webApplication.Sites; foreach (SPSite siteCollection in siteCollections) { Label1.Text += siteCollection.Url + "<BR>"; //for sites

string webUrl = siteCollection.Url ;

using (SPWeb oWebsite = new SPSite(webUrl).OpenWeb())
{
    SPWebCollection collWebsite = oWebsite.Webs;

    foreach (SPWeb subSite in collWebsite)
    {
        Label1.Text += SPEncode.HtmlEncode(subSite.Title) + "<BR>";
        subSite.Close();
    }
}

siteCollection.Close(); }

 

Vielen Dank im Voraus!

Matthias

 

Alle Antworten

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 3 Dez. 2013 10:18
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Wo genau klemmt's denn? Du hast doch im Grunde schon alles (wenn auch etwas umständlich).

Wie man and die SiteCollections kommt, weißt Du ja. Um an die Webs zu kommen, mußt Du aber kein neues SPSite erzeugen. Entweder Du gehst von SPSite.RootWeb aus und dann rekursiv die Webs durch (über SPWeb.Webs) oder gleich ohne Hierarchie über SPSite.AllWebs.

Dein Code berücksichtigt derzeit nur die aktuelle WebApplication. Wenn Du hier auch alle haben möchtest, mußt Du über die Farm gehen (SPFarm.Local).

Beachte aber, daß dieser Code nur unter einem Farmadmin-Account läuft, der auch wirklich die Berechtigungen dazu hat.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
634 Beiträge
Olaf Didszun Als Antwort am 3 Dez. 2013 22:12
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Mache bitte in der foreach-Schleife noch ein subSite.Dispose().

Grüße

Olaf

Ohne Rang
634 Beiträge
Olaf Didszun Als Antwort am 3 Dez. 2013 22:13
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Desgleichen bitte auch in der foreach-Schleife, die über die SiteCollections läuft. :-)

Grüße

Olaf

Ohne Rang
17 Beiträge
Matthias Baureis Als Antwort am 4 Dez. 2013 08:14
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo,

also bei mir klemmts noch, ob ich das genau implementieren soll. Ich starte das Visual Studio und dann wähle ich ein neues Projekt aus. Soll ich dann SharePoint-Lösungen wählen oder ein leeres Projekt?

Wenn ich das leere Projekt geöffnet habe, muss ich den Code einfach einfügen?

Vielen Dank im Voraus!

Matthias

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 4 Dez. 2013 08:25
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hängt davon ab, was Du für eine Anwendung haben möchtest. Wenn es ein Konsolenprogramm sein soll, nimm die entsprechende Vorlage. Wenn es ein Windowsprogramm sein soll, nimm die entsprechende Vorlage. Wenn es irgendwie in SharePoint integriert sein soll, dann nimm ein leeres SharePoint-Projekt.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
17 Beiträge
Matthias Baureis Als Antwort am 4 Dez. 2013 08:28
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hey nochmal,

wenn ich dann das Projekt gestartet habe, wo muss ich den Code einfügen? Muss ich ein neues Element hinzufügen? Dort stehe ich ein bisschen auf dem Schlauch.

Wäre gut, wenn ich eine kleine Anleitung bekommen könnte...oder einen Link wo die Sachen ein bisschen erklärt sind.

Viele Grüße

Matthias

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 4 Dez. 2013 08:36
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Wie oben schon gesagt: hängt davoan ab, was Du eigentlich erreichen möchtest. Es gibt nicht die eine Anleitung...

Wenn Du einfach nur üben und ein bißchen probieren möchtest, würde ich ein Konsolenprogramm empfehlen.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
17 Beiträge
Matthias Baureis Als Antwort am 4 Dez. 2013 11:48
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hey,

danke für die Antwort. Also ich würde gern die SharePoint Sites alle auf der Console ausgeben. Somit muss ich nur die SharePoint Bibliotheken einbinden und dann ganz normal in Visual Studio eine Konsollenanwendung programmieren, richtig? oder muss ich die SharePoint Power Shell nehmen?

SPWebApplication webApplication = SPContext.Current.Site.WebApplication;

SPSiteCollection siteCollections = webApplication.Sites;

In dieser Zeile muss ich dann SPWebApplication auf meine WebApp setzen also z.B. //myWebapp/ webApllication ... da hänge ich noch ein bisschen.

vielen Dank für die Hilfe im Voraus!

Matthias


Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 4 Dez. 2013 11:58
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Du mußt Dich schon entscheiden. Entweder ein Konsolenprogramm oder powerShell. Es geht beides.

In Visual Studio ein Konsolenprogramm anlegen, Microsoft.SharePoint.dll referenzieren, dafür sorgen, daß für x64 kompiliert wird, fertig.

[quote user="Matthias Baureis"]SPWebApplication webApplication = SPContext.Current.Site.WebApplication[/quote]

Das geht nicht, weil SPContext.Current hier null ist. Das geht nur, wenn es einen HttpContext gibt. Du kannst hier aber SPWebApplication.Lookup("Url") benutzen.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
12 Beiträge
AlexNitter Als Antwort am 6 Dez. 2013 11:04
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Moin,

also, um es so einfach wie möglich zu machen würde ich folgendermaßen anfangen:

Als erstes Visual Studio als Administrator öffnen, dann ein neues Projekt vom Typ Konsolenanwendung erstellen. Dabei unbedingt darauf achten, dass das Projekt die .Net-Version 3.5 hat. Als nächstes in den Projekteigenschaften die Zielplattform auf x64 setzen. Daraufhin die Microsoft.SharePoint.dll einbinden. Damit hast du alle Voraussetzungen erfüllt, um eine Konsolenanwendung für SharePoint zu schreiben.

Im Grunde könntest du jetzt deinen Code einfach in die "Main"-Methode des Konsolenanwendung schreiben.

Allerdings passt dein Code nicht ganz dazu. Erstens funktioniert "SPContext.Current" nicht in der Konsole, und zweitens ist dein Code auf eine Webanwendung ausgelegt sprich er schreibt die Ergebnisse in ein Label. Dein Code sollte etwa so aussehen:

String rootWebUrl = "[URL]";

using (SPSite site = new SPSite(rootWebUrl))

{

SPWebApplication webApp = site.WebApplication;

foreach (SPSite subSite in webApp.Sites)

{

Console.WriteLine("SiteCollection-Url: " + subSite.Url);

foreach (SPWeb web in subSite.AllWebs)

{

Console.WriteLine("Subweb: " + web.Title);

}

Console.WriteLine("");

}

}

Console.Read();

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 6 Dez. 2013 11:36
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Aber bitte die Anmerkung von Olaf weiter oben beachten: SPSite und SPWeb-Instanzen immer Dispose()-en.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
12 Beiträge
AlexNitter Als Antwort am 6 Dez. 2013 11:38
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Richtig, oder einfach das "using"-Statement verwenden.