jueves, 9 de junio de 2011

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

No hay comentarios:

Publicar un comentario