Error Missing Assembly en el Health Analyzer

Uno de los hallazgos más comunes en el Health Analyzer, cuando se desarrollan soluciones a la medida en SharePoint 2010 es el siguiente:

 

Assembly [My.Assembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cfc9a4dcd383ae1e] is referenced in the database [WSS_Content], but is not installed on the current farm. Please install any feature/solution which contains this assembly.

 

La mayoría de las veces el hallazgo es acerca de Recibidores de Eventos que no han sido correctamente desinstalados, ya sea en la desactvación o eliminación de la solución.

 

En esta entrada de blog pretendo compartir con ustedes un script de Power Shell con el don de ayudar a identificar y remover estos Recibidores de Eventos corruptos.

 

El script contiene las siguientes funciones:

 

Delete-MissingAssembly: Esta es la función principal que recorre cada posible contenedor en la base de datos que pueda tener Recibidores de Eventos, esto quiere decir Colección de listas, Sitios o Listas.

 

Remove-EventReceiver: Esta función revisa si un contenedor de Recibidores de Eventos tiene alguno con el nombre de assembly que se le pase como parámetro, y trata de eliminarlo.

 

Las 2 funciones tienen un parámetro (ReportOnly) que permite definir si se quiere eliminar o no el Recibidor de Evento encontrado.

 

function Delete-MissingAssembly($ContentDb, $Assembly, [switch]$ReportOnly)

{

       [bool]$report = $false

       if ($ReportOnly) { $report = $true }

       $database = Get-SPContentDatabase | ?{$_.Name -eq $ContentDb}

    foreach($site in $database.Sites)

    {

        Remove-EventReceiver -ERContainer $site -Assembly $Assembly -ReportOnly $report

        foreach($web in $site.AllWebs)

        {

            Remove-EventReceiver -ERContainer $web -Assembly $Assembly -ReportOnly $report

            foreach($list in $web.Lists)

            {

                Remove-EventReceiver -ERContainer $list -Assembly $Assembly -ReportOnly $report

            }

        }

    }

}

 

function Remove-EventReceiver($ERContainer, $Assembly, $ReportOnly)

{

    foreach($er in $ERContainer.EventReceivers)

       {

             if($er.Assembly -eq $Assembly)

             {

                    Write-Host "Event Receiver with Id[" $er.Id "], Name[" $er.Name "] and Type [" $er.Type "] found in [" $ERContainer.Url $ERContainer.DefaultViewUrl "]."

                    if($ReportOnly -eq $false)

                    {

                Write-Host "Try to delete the receiver:"   

                $er.Delete()

                Write-Host "ER deleted."

                    }

             }

       }

}

 

 

Después de que usted guarde este script en un archivo PS1 y lo importe en Power Shell (Ejemplo: Import-Module .\MissingEV.PS1), usted puede ejecutar el script de esta forma:

 

Delete-MissingAssembly -ContentDb WSS_Content -Assembly "My.Assembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cfc9a4dcd383ae1e" -ReportOnly

 

La salida de ejecución del comando puede ser:

 

Como se puede ver en la salida de Power Shell, muestra el Id, Nombre, Tipo y ubicación del Recibidor de Eventos, donde usted puede decidir si borrar o no este, por lo contrario debería utilizar otra herramienta o directamente con PS.

 

Espero que esta entrada sirva para resolver los típicos problemas del hallazgo “Missing server dependencies” en el Health Analyzer.