jueves, 9 de junio de 2011

El webpart ListingSummary no migra correctamente a Sharepoint 2010 (SOLUCION)

Problema:
Al realizar una migración a sharepoint 2010, si en algun sitio se ha usado el webpart de ListingSummary, este aparece como ErrorWebPart.

Causas:
Parece que a los chicos de microsoft se les ha pasado efectuar una operacion de transformación
para migrar correctamente este webpart


WorkAround:
Podemos ver la documentación de microsoft acerca del ListingSummary en esta página
http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.portal.webcontrols.listingsummary_members(v=office.12).aspx

Este webpart nos permite usar ficheros externos XSLT para mostrar los datos con formato. Es posible que haya que reconfigurarlo pero es muy sencillo.


Si investigamos un poco, nos damos cuenta que no es posible que hayan BORRADO sin más este webpart, ya que en 2010 no aparece.... al menos donde estaba.
Lo que ha ocurrido es que lo han movido de namespace , le han cambiado el nombre y le han hecho unas mejoras (tiene mas parametros)
Podemos ver la documentación del ContentByQueryWebPart en esta página
http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.publishing.webcontrols.contentbyquerywebpart_members.aspx



Solucion 1:
-Elimiar el ErrorWebpart

- Añadir el ContentByQueryWebPart y configurarlo a mano (hay que copiar la configuración antes de migrar)

Nota: Al configurarlo algunas propiedades nuevas son obligatorias.


Solucion2:

-Exportar el webpart como fichero ".webpart" (se hace desde la edicion de la pagina)

-Migrar a 2010

-Modificar a mano el fichero ".webpart"

Sustituir:

type name="Microsoft.SharePoint.Portal.WebControls.ListingSummary, Microsoft.SharePoint.Portal, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"

Por esto:

type name="Microsoft.SharePoint.Publishing.WebControls.ContentByQueryWebPart, Microsoft.SharePoint.Publishing, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"

-Verificar que las nuevas propiedades obligatorias tienen valor.

-Importar a 2010 el fichero ".Webpart"

Cuidado:
Al realizar una migración InPlace, aparece el ErrorWebpart y pierdes la configuración que tenia, apuntadla para tenerla a mano.


Saludos Espero que os sirva de ayuda.

Roberto Marcos.

Eliminar Features Corruptas A LA FUERZA en Sharepoint 2007 con PowerShell

Escenario:

Uno de los pasos recomendados en las migraciones de Sharepoint 2007 a 2010, es limpiar el entorno de origen.

 

Problema:

Por desgracia muchas features que fueron usadas, activadas, retraídas, borradas, etc... al final se quedan como activas o de alguna manera hay referencias en la base de datos de contenidos, estas referencias nos salen como errores al realizar el "preupgradecheck".

 

Solución MicroSoft:

Utilizar estos programas para limpiar http://archive.msdn.microsoft.com/WssAnalyzeFeatures y http://archive.msdn.microsoft.com/WssRemoveFeatureFrom

Os anticipo que hay muchos casos en los que no es capaz de borrarlas


Solución Infalible:

Trasteando con la documentación vemos que accediendo mediante object modal se pueden borrar, pero tenemos adicionalmente la opción de FORCE, la cual solo es accesible por código, curiosamente es la única forma limpia de quitar todas estas features corruptas (sin tocar la base de datos de contenidos).

 

Con este PowerShell que he preparado, dejaremos nuestro entorno limpio de features mal instaladas o con problemas.

Le he puesto una salida a gridView para ver que va borrando.


Tras lanzar este script, desaparecerán los errores relacionados con features corruptas al realizar el preupgradecheck.


Nota: Si hay muchos sitios y muchas webs, el servidor a veces "SE ESTRESA" y da timeouts, yo recomiendo lanzarlo un par de veces.



=====================================

[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint")

[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Portal")

#Author : Roberto Marcos Asensio (info@robertomarcos.com)


function remove-spmissingfeatures([Boolean]$force) 


    $farm = [Microsoft.SharePoint.Administration.SPFarm]::Local

    foreach ($spService in $farm.Services) {

        if (!($spService -is [Microsoft.SharePoint.Administration.SPWebService])) {

            continue;

        }


        foreach ($webApp in $spService.WebApplications) {

        

            if ($webApp -is [Microsoft.SharePoint.Administration.SPAdministrationWebApplication]) { continue }


                   #foreach ($site in $webApp.Sites  |Where-Object {$_.Url -match "intranet.miempresa.com"} ) {

                    foreach ($site in $webApp.Sites) {


                      foreach ($feature in $site.features) { 

                        if ($feature.definition -eq $null) { 

                         $data = @{

                        "MissingFeature" =  $feature.DefinitionId

                        "Parent"=$feature.parent 

                        "Web" = $site.Url;

                         }

                         New-Object PSObject -Property $data

                       

                          $site.features.remove($feature.DefinitionId,$force

                       

                        } 

                      }

                      

                      

                       foreach ($web in $site.AllWebs ){

                          

                          foreach ($feature in $web.features) { 

                            if ($feature.definition -eq $null) { 

                          

                                 $data = @{

                                "MissingFeature" =  $feature.DefinitionId

                                "Parent"=$feature.parent 

                                "Web" = $web.Url;

                                 }

                                 New-Object PSObject -Property $data

                                  $web.features.remove($feature.DefinitionId,$force) 

                            } 

                          }


                        }

                    }

            }

        }

        

 }    

remove-spmissingfeatures($true) | Out-GridView


=====================================
Saludos, espero que os sea de utilidad.
Roberto Marcos