Kategorien
IT SharePoint

SharePoint: Versionsnummer mit Hilfe von SharePoint Designer ermitteln

Um die Vesionsnummer des aktuell installierten SharePoint-Servers zu ermitteln gibt es viele Wege. Einige davon sind etwas umständlicher und liefern auch nicht immer leicht verständliche Ergebnise (mehere Versionsnummern z.B., wenn man in der SharePoint Central Administration unter Check product and patch installation status nachschaut).

Eine einfache Möglichkeit die aktuelle Versionsnummer der SharePoint-Installation zu ermitteln, bietet der SharePoint Designer. Einfach den Designer öffnen und auf eine Site auf dem gewünschten Server verbinden. Auf der Startseite findet man dann unter der Rubrik „Site Information“ die aktuelle Version:

SharePoint Designer Site Information
SharePoint Designer Site Information
Kategorien
IT SharePoint

SharePoint: Inhaltsdatenbank-Version an SharePoint-Version angleichen

Wenn man in einer SharePoint-Installation ein neues Cumulatives Update installiert um Programm-Fehler zu beheben, so wird die gesamte SharePoint-Version hochgehoben, also die Assemblies/Dlls etc. aktualisiert und haben dadurch höhere Versionsnummern.

Die Inhaltsdatenbank (Content Database) wird grundsätzlich aber nicht automatisch aktualisiert und behält das alte Schema und auch die alte Versionsnummer bei.

In der Regel ist dies nicht weiter tragisch, aber unter Umständen kann es trotzdem nötig werden, dass man die Inhaltsdatenbank aktualisiert und damit ihre Version an diejenige des SharePoint-Serves angleicht, so zum Beispiel, wenn man ein Backup einer Site-Collection einspielen möchte (Restore-SPSite), welches von einer Site/Datenbank mit der höheren Versionsnummer, die des Servers, entstammt.

Um manuell die Inhaltsdatenbank zu aktualisieren, kann man sich der SharePoint Management Shell bedienen.

Zuerst sollte man die gewünschte Content Database in eine Variable laden (wobei man „SQLServerName\WSS_Content_Database_Name“ durch den entsprechenden Datenbank-Server und Namen der Inhaltsdatenbank ersetzen muss):

$contentdb = Get-SPContentDatabase | Where-Object {$_.Name -match "SQLServerName\WSS_Content_Database_Name"}

Ist unklar, wie die Inhaltsdatenbank heisst, so kann man zuerst einfach nur Get-SPContentDatabase eingeben um eine Auflistung aller Inhaltsdatenbanken zu erhalten. Sollte die gewünschte Datenbank nicht aufgeführt sein, sollte sicher gestellt werden, dass diese in der Central Administration im Status „Ready“ ist.

Danach kann man mit folgendem PowerShell-Befehl die Aktualisierung starten:

Upgrade-SPContentDatabase -Identity $contentdb

In der PowerShell wird der Fortschritt in Prozent angezeigt. Bei grösseren Datenbanken kann die Aktualsierung mehrere Minute bis hin zu Stunden dauern.

Weitere Informationen findet ihr in diesem Technet-Artikel: http://technet.microsoft.com/en-us/library/ff607813.aspx

Kategorien
IT SharePoint

SharePoint: Alerts für Volltext-Suchresultate aktivieren

SharePoint 2010 bietet ja die Möglichkeit auf Listen Alerts einzurichten. Wenn Elemente geändert oder hinzugefügt werden, kann man sich so über Email oder auch SMS benachrichtigen lassen. Sehr praktisch wenn man etwas beobachten möchte, aber nicht die ganze Zeit manuell sich durch Listen wühlen möchte.

Solche Alerts kann man praktischerweise aber auch in der SharePoint-Suche aktivieren. So kann man sich benachrichtigen lassen, wenn die Volltextsuche zu einem bestimmten Suchbegriff ein neues oder geändertes Element findet.

SharePoint Search Alerts anlegen
SharePoint Search Alerts anlegen

Die Möglichkeit solche Alerts in der Volltext-Suche zu verwenden ist jedoch in der Grundeinstellung deaktiviert. Der Link dazu ist zwar vorhanden, doch möchte man einen neuen Alert hinzufügen, erscheint folgende Fehlermeldung:

Search alerts have been turned off for this Search Application. For assistance, contact your server administrator.

Über die „Central Administration“ von SharePoint kann dies einfach aktiviert werden:

  • In der „SharePoint 2010 Central Administration“ auf „Manage service applications“ gehen (in der Sektion „Application Management“)
  • In der Liste die „Search Service Application“ finden und den Link zum Öffnen anklicken
  • In der obersten Rubrik „System Status“ befindet sich ziemlich zu unter der Eintrag „Search alert status“
  • Bei „Search alert status“ auf der rechten Seite auf „Enable“ klicken um Alerts zu aktivieren
Alerts für Suchresultate in der Search Service Administration aktivieren
Alerts für Suchresultate in der Search Service Administration aktivieren

Grosse Nachteile, bei aktivierter Einstellung, sind mir nicht bekannt, aber ich vermute dass bei einigen 10’000 Alerts die Performance etwas leiden könnte, vermutlich in den meisten Szenarien vernachlässigbar. Die MSDN zu Thema Alerts für die Suche erwähnt jedenfalls nichts dazu.

Kategorien
IT SharePoint

SharePoint: Elemente ohne Ordner in einem DataView-WebPart anzeigen

Wenn man im SharePoint-Designer eine ganz normale View, welche ein XslListView-WebPart enthält bearbeitet, so kann man via Ribbon einstellen wie mit Ordnern umgegangen werden soll. Entweder es wird nur der Inhalt eines spezifischen Ordners angezeigt, es werden alle Elemente aller Ordner angezeigt oder es werden alle Elemente und alle Ordner (mit Unterordner) angezeigt.

Verwendet man auf der View jedoch ein DataView-WebPart (zum Beispiel weil, man nach mehr als zwei Elementen gruppieren möchte), so sind diese Optionen zwar auch im Ribbon verfügbar, doch scheinen sie keine Auswirkungen mehr zu haben (Bug?).

Die gewünsche Einstellung lässt sich aber zum Glück auch ohne (zumindest fast ohne) Klicki-Bunti von Hand erledigen:

  1. Dazu öffnet man (im SharePoint Designer) am einfachsten die View in der Split-Ansicht oder Code ansicht, so dass man den Quellcode der Seite bearbeiten kann.
  2. Nun sucht man nach dem Tag „SharePoint:SPDataSource“ innerhalb des DataForm-/DataView-WebParts und klickt diesen an.
  3. Nun sollte das „Tag Properties“-Window erscheinen (falls nicht, muss dieses zuerst via Kontextmenü geöffnet werden)
  4. Unter „Tag Properties“ gibt es nun einen Eintrag „Scope“ und der Wert dafür kann man bequem mittels Dropdownmenü selektieren, z.B. „Recursive“ (alle Elemente) oder „RecursiveAll“ (alle Elemente und alle Ordner).
  5. Zum Schluss natürlich die Seite noch abspeichern und wenn nötig Publishen, damit die Änderung für einem selber und Benutzer sichtbar wird

Mehr details zu „Scope“ findet ihr in der MSDN zum SPViewScope-Eintrag.

Kategorien
IT SharePoint

SharePoint: „Ungültige Formel“-Fehler

Heute habe ich in einer Liste eine Formel zur Validierung eines Listenelementes einbauen wollen („List Settings“->“Validation Settings“).

Die Formel sollte sicherstellen, dass nur Elemente gespeichert werden können, bei denen das Anfgangsdatum kleiner ist als das Enddatum und dass beide Daten im selben Jahr liegen.

Folgende Formel hatte ich zuerst verwendet:

=AND([From Date]<=[To Date],YEAR([From Date])=YEAR([To Date]))

Beim abspeichern der Formel erhielt ich, für mich überraschend, folgende Fehlermeldung:

"The formula contains a syntax error or is not supported"
Fehlermeldung: „The formula contains a syntax error or is not supported“

Der Fehler war für mich nicht gleich ersichtlich, ich habe den Aufbau der Formel 1:1 von anderen Beispielen übernommen, wie z.B. von http://adicodes.com/column-validations-and-list-validations-in-sharepoint-2010/ oder von Microsoft selber (http://office.microsoft.com/en-us/sharepoint-server-help/examples-of-common-formulas-HA010105479.aspx).

Nach einigem analysieren und suche im Internet bin ich auf eine Seite gestossen, welche den Fehler beschreibt.

Scheinbar sind die Formeln abhängig von der Sprache des Betriebssystems (des Servers), sowie der gewählten Regionaleinstellungen. Auf dem Server war folgendes Listen-Trennzeichen eingestellt:

Listentrennzeichen-Einstellung in den Regionaloptionen in der Systemsteuerung
Listentrennzeichen-Einstellung in den Regionaloptionen in der Windows-Systemsteuerung

Das Trennzeichen für die verschiedenen Unterformeln musste also von „,“ auf „;“ gewechselt werden, was folgende Formel ergab:

=AND([From Date]<=[To Date];YEAR([From Date])=YEAR([To Date]))

Oder im SharePoint in den „Validation Settings“:

"SharePoint List Validation Settings"-Formel

Danach konnte die Formel gespeichert werden und validiert nun sinngemäss die Listen-Elemente.

 

Kategorien
IT SharePoint

SharePoint: Assemblies/Dlls in WSP einbinden

Manchmal hat mit in einem SharePoint-Visual-Studio-Projekt abhängigkeiten zu einem anderen Projekt oder gar zu externen DLLs.

Mittels „References“ können die Referenzen auf diese DLLs festgelegt werden, so dass die Klassen, Methoden etc. dieser Objekte zur Verfügung stehen und mittels „Project Dependencies“ kann man die Abhängigkeiten beeinflussen, so dass die korrekte Build-Reihenfolge geplant wird. Aber wir kann man sicherstellen, dass eine externe, welche nicht aus dem aktuellen Projekt kommt, DLL auch wirklich mitausgeliefert wird, wenn man die Solution als WSP auf dem Zielserver installiert?

SharePoint bietet hierfür eine einfache Möglichkeit. Man kann im „Solution Explorer“ innerhalb des gewünschten Projektes den Package-Knoten öffnen und dort das Package öffnen:

In der nun erscheinenden Ansicht des Package muss man im unteren Bereich des Fensters auf „Advanced“ klicken um die Ansicht zu wechseln:

In dieser Advanced-Ansicht werden alle zusätzlichen Assemblies aufgelistet. Mit einem Klick auf „Add“ kann man einen Eintrag hinzufügen. Je nach Quelle der Assembly muss man wählen ob diese aus dem Output eines Projektes entstammt oder aus einer anderen Quelle. Hier zum Beispiel die Ansicht beim hinzufügen einer existierenden Assembly:

SharePoint Package Add Existing Assembly
Dialog für das Hinzufügen einer existierenden Assembly zum Package

Man hat hier zudem die Möglichkeit festzulegen, ob die Assembly auf Stufe WebApplication oder in den GAC deployed werden soll.

Hat man diese Einstellungen vorgenommen, so wird beim nächsten Packaging (Menübefehl: Build -> Package) die jeweilige Assembly ins WSP integriert.

Kategorien
IT SharePoint

SharePoint: Alle Elemente einer Liste mittels PowerShell löschen

Wenn man alle Listen-Elemente einer SharePoint-Liste löschen möchte, dann kann das manuelle Löschen mittels Browser sehr umständlich sein. Selbst in der Datasheet-View ist es sehr mühsam alle Elemente auf einen Schlag zu löschen, da bei grosser Anzahl an Elementen Timeouts auftreten können. Leider fehlt im GUI eine benutzerfreundliche Option im Sinne von „Lösche alle Elemente dieser Liste“.

Mit einem PowerShell-Skript kann man dies Vorhaben jedoch ziemlich einfach und nerven-schonend durchführen:

[System.Reflection.Assembly]::Load("Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c")

# "Enter the site URL here"
$SITEURL = "http://siteCollectionUrl"

$site = new-object Microsoft.SharePoint.SPSite ( $SITEURL )
$web = $site.OpenWeb()
"Web is : " + $web.Title

# Enter name of the List below
$oList = $web.Lists["InternalListName"];

"List is :" + $oList.Title + " with item count " + $oList.ItemCount

$collListItems = $oList.Items;
$count = $collListItems.Count - 1

for($intIndex = $count; $intIndex -gt -1; $intIndex--)
{
        "Deleting : " + $intIndex
        $collListItems.Delete($intIndex);
}

Das Skript in einer „ps1“-Datei speichern (z.B. „DeleteAllListElements.ps1“), darin den URL der „Site Collection“ den internen Listennamen anpassen, danach direkt ausführen um die Elemente zu löschen.

Möchte man alle Elemente, einschliesslich aller Ordner und aller Elemente in Ordnern/Unterordnern löschen, so kann man das folgende PowerShell-Skript verwenden (auch hier muss man den URL und den Listennamen anpassen):

Add-PSSnapin Microsoft.SharePoint.PowerShell -erroraction SilentlyContinue

$web = Get-SPWeb "https://siteCollectionUrl"
$list= $web.GetList("/Lists/InternalListName")


foreach ($item in $list.items)
{
	$deleteItem = $list.GetItemById($item.ID)
	$deleteItem.Delete()
}

foreach ($folder in $list.Folders)
{
	$deleteFolder = $list.GetItemById($folder.ID)
	$deleteFolder.Delete()
}

 

Kategorien
IT SharePoint

SharePoint: TaxonomyHiddenList manuell aktualisieren

Unter gewissen Umständen und mit gewissen Cumulativen Updates für den SharePoint 2010 kann es vorkommen, dass die TaxonomyHiddenList nicht mehr auf dem aktuellsten Stand ist, da die Synchronisation mit dem Term-Store (Terminologiespeicher) nicht mehr fehlerfrei durchgeführt werden kann.

Abhilfe (wenn auch eventuell nur temporäre?)  schafft folgendes PowerShell-Skript:

$Assem = (
	"Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" ,
	"Microsoft.SharePoint.Taxonomy, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"
)

$Source = @"
using Microsoft.SharePoint;
using Microsoft.SharePoint.Taxonomy;
using System;

namespace TaxonomyUpdater
{
	public static class TaxonomyHiddenList
	{
		public static void Update(string SiteUrl)
		{
			SPSite Site2Update = new SPSite(SiteUrl);
			TaxonomySession.SyncHiddenList(Site2Update);
			Site2Update.Dispose();
		}
	}
}
"@

Add-Type -ReferencedAssemblies $Assem -TypeDefinition $Source -Language CSharp

Das Skript muss man in einen Text-Editor einfügen und als „UpdateTaxonomyHiddenList.ps1“ abspeichern.

Danach das Skript in einer PowerShell einmal ausführen, damit die Klasse verfügbar wird. Zum Schluss mit folgendem Befehl die Synchronisation starten:

[TaxonomyUpdater.TaxonomyHiddenList]::Update(“http://SharePointServer”)

Siehe auch: http://blogs.msdn.com/b/joerg_sinemus/archive/2011/03/03/terms-and-how-to-update-taxonomyhiddenlist-when-the-timer-job-was-not-able-to-update.aspx

Kategorien
IT SharePoint

SharePoint: Aktuelle Seiten-URL in CustomAction verwenden

Manchmal kann es vorkommen, dass man in einer SharePoint-UrlAction innerhalb einer CustomAction die aktuelle Seite mitgeben möchte. Dies kann zum Beispiel sinnvoll sein, wenn man nach dem Klick auf den „OK“-Button auf der aufgerufenen Seite wieder auf die ursprüngliche Seite zurückkehren möchte.

Normalerweise ist eine CustomAction/UrlAction wie folgt aufgebaut:

<?xml version="1.0" encoding="utf-8">
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
   <CustomAction Id="MyAction" GroupId="PersonalActions" Location="Microsoft.SharePoint.StandardMenu" Sequence="1000" Title="My custom action">
        <UrlAction Url="~sitecollection/_layouts/page.aspx">
    </CustomAction>
</Elements>

Und leider gibt es kein eingebauten Platzhalter für die aktuelle Seite.

Mit etwas JavaScript kann man dieses Problem aber Lösen und den URL-Parameter „Source“ dynamisch abfüllen lassen:

<UrlAction Url="javascript:window.location='{SiteUrl}/_layouts/page.aspx?List={ListId}&Source=' + window.location">

SharePoint verwendet diesen Source-Parameter um den Benutzer auf die jeweilige Seite zu leiten.