imageDas Button “Zur Homepage machen” aus dem “Seite”-Ribbon von SharePoint setzt die Seite auf der sich der Benutzer gerade befindet als Startseite für die aktuelle Website. Dies ist extrem praktisch, wenn man z.B. bei einer migrierten Website die alte default.aspx wieder zur Homepage machen will.

Wenn dies aber für alle Websites einer Websitesammlung oder sogar mehrerer Websitesammlungen geschehen soll, bietet sich ein PowerShell Skript an. Die MSDN verweist hier auf das Property WelcomePage:

http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spfolder.welcomepage.aspx

using (SPSite oSiteCollection = new SPSite("http://MyServer/sites/MyWikiSite"))
{
    SPWeb oWebsite = oSiteCollection.OpenWeb();
    SPFolder oFolder = oWebsite.RootFolder; 
    oFolder.WelcomePage = "My Wiki Library/MyWelcome.aspx";
    oFolder.Update();
    oWebsite.Dispose();
}

Als ich diesen Code in PowerShell umsetzen und dabei natürlich auch ein bisschen kürzen wollte, kam ich zu folgendem Ergebnis:

$web = Get-SPWeb http://myweb/$web.RootFolder.WelcomePage = “default.aspx”$web.RootFolder.Update()$web.Dispose

Das Problem: Es funktioniert nicht! Es gibt zwar keine Fehlermeldung, aber das Property hat auch im Anschluss den alten Wert, so als ob die Update-Methode nie aufgerufen worden wäre.

Die Ursache: SPWeb.RootFolder gibt bei beiden Aufrufen jeweils ein neues SPFolder-Objekt zurück, das Property wird also auf der einen Instanz gesetzt und dann auf der anderen Instanz die Update-Methode aufgerufen.

Die Lösung: SPWeb.RootFolder nur einmal in eine Variable abrufen und diese dann benutzen:

$web = Get-SPWeb http://myweb/$folder = $web.RootFolder$folder.WelcomePage = “default.aspx”$folder.Update()$web.Dispose()

So klappt es und wir haben unsere alte Homepage zurück.

4 Comments

  1. avatar

    Gerd H.

    Antworten

    Interessanter Beitrag, Herr Röhrs. Aber die Ursache habe ich nicht begriffen. Könnten Sie das noch etwas erläutern?

  2. avatar

    Jan-Hendrik Röhrs

    Antworten

    Hallo Herr H.,

    gerne, das Property SPWeb.RootFolder hat kein Field, das einfach zurückgegeben oder per lazy load befüllt wird, sondern erzeugt bei jeder Abfrage ein neues SPFolder Objekt:

    get { return new SPFolder(this, “”); }

    Wenn die Eigenschaft WelcomePage geändert wird, muss die Methode Update ausgeführt werden, damit diese Änderung auch tatsächlich in den Folder / in das Web übernommen wird.

    Der erste Powershell Code tut also (leider) folgendes:
    1. Erzeuge ein neues SPFolder Objekt [1] (mit den aktuellen Einstellungen des RootFolders)
    2. Setze das Property WelcomePage dieses Objekts
    3. Erzeuge ein neues SPFolder Objekt [2] (mit den aktuellen = alten Einstellungen des RootFolders)
    4. Führe die Update Methode auf dem Objekt [2] aus (das die Änderung aber nicht kennt und daher nichts aktualisieren kann).

    Ich hoffe das klärt die Sache ein wenig auf, wenn Sie weitere Fragen haben, nur zu.

  3. avatar

    Ten Eniunlsl

    Antworten

    Danke für den beitrag, eine frage habe ich allerdings noch, wenn ich eine einfache html seite als WelcomePage festlege was ich aus diversen technischen gründen machen muss. Wird mir diese immer als Download angeboten.
    Gibt es eine möglichkeit dies abzustellen?

    Schon mal Danke im Voraus

  4. avatar

    Ten Eniunlsl

    Antworten

    Hallo also ich hoff das ich noch eine Antwort kriege, mach das allerdings via C# in einem Feature Receiver. Hoffe du kannst mir helfen brauch das nämlich umbedingt für meine Projektarbeit im Mai…

    Danke

Leave a comment

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Time limit is exhausted. Please reload the CAPTCHA.