Manchmal ist es interessant zu wissen, wo WebParts benutzt werden. Dies wird insbesondere bei Migrationen (bspw. von SharePoint 2007 auf SharePoint 2010) wichtig, wenn es sich um WebParts handelt, die u.U.
- nur zu Testzwecken auf der Quell-Umgebung (2007) installiert wurden und auf der Ziel-Umgebung nicht mehr benötigt werden oder
- für die Ziel-Umgebung (2010) überhaupt nicht supported werden (weil es bspw. eine SharePoint 2007 spezifische Entwicklung war)
Es gibt zwei Arten von WebPart-Problemen bei einer Migration:
- Defekte WebParts
- Fehlende WebParts (DLLs, Features, WebPart-Dateien)
Ein defektes WebPart wird vor der eigentlichen Migration auf der Quell-Umgebung mittels der STSADM-Operation “PreUpgradeCheck” ermittelt. Fehlende WebParts werden während der Migration auf der Ziel-Umgebung beim Ausführen des PowerShell-Cmdlets “Test-SPContentDatabase” ermittelt. (Eigentlich ist das Ermitteln fehlender WebParts auf der Ziel-Umgebung nur als zusätzliches Sicherheitsnetz in der Migrations-Manege zu betrachten, da bereits während der Analyse-Phase dokumentiert werden sollte, welche WebParts auf der Ziel-Umgebung installiert und deployt werden müssen.)
In beiden Fällen ist die einzig verwertbare Information die angegebene WebPart-ID. Um zu evaluieren, ob das genannte WebPart genutzt bzw. benötigt wird, müssen alle SharePoint-Seiten (also die URLs) ermittelt werden, die das WebPart nutzen.
Hierbei hilft STSADM nur begrenzt, da es nur die Website-URL ausgibt (STSADM -o EnumAllWebs -IncludeWebParts). Sobald sich ein WebPart aber bspw. in einer WebPart-Page befindet, müsste man beginnen in den Untiefen einer Website das gesuchte WebPart zu finden.
Was hilfreich ist, sind SQL-Abfragen. Ich habe mal (inspiriert durch einen MSDN-Foren-Eintrag) drei sehr triviale SQL-Queries zusammengetragen, die das Auffinden von WebParts anhand einer WebPart-ID erleichtern.
- SELECT tp_SiteId, tp_PageUrlID FROM [WebParts] where tp_WebPartTypeId = ‘<WebPart-ID>‘
- SELECT PortalURL FROM [Sites] where Id = ‘<tp_SiteId>‘
- SELECT DirName, LeafName FROM [AllDocs] where Id = ‘<tp_PageUrlID>‘
Hinweis: Zugriffe auf SharePoint-Datenbanken sind mit Vorsicht zu genießen.
Die URL einer SharePoint-Page, die das gesuchte WebPart beinhaltet setzt sich dann wie folgt zusammen: <PortalURL>/<DirName>/<LeafName>
Das Löschen von WebParts ist übrigens über die WebPart-Verwaltungsseite möglich. Dazu einfach an die gefundene URL den HTTP-Get-Parameter “contents=1″ anhängen, dann wird man auf diese Seite weitergeleitet. Also bspw. <URL>?contents=1