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.
functionDelete-MissingAssembly($ContentDb,$Assembly,[switch]$ReportOnly)
{
[bool]$report=$false
if ($ReportOnly) { $report=$true }
$database=Get-SPContentDatabase|?{$_.Name -eq$ContentDb}
foreach($sitein$database.Sites)
{
Remove-EventReceiver-ERContainer$site-Assembly$Assembly-ReportOnly$report
foreach($webin$site.AllWebs)
{
Remove-EventReceiver-ERContainer$web-Assembly$Assembly-ReportOnly$report
foreach($listin$web.Lists)
{
Remove-EventReceiver-ERContainer$list-Assembly$Assembly-ReportOnly$report
}
}
}
}
functionRemove-EventReceiver($ERContainer,$Assembly,$ReportOnly)
{
foreach($erin$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-ContentDbWSS_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.