Erro MissingAssembly no Health Analyzer
Em ambientes que temos soluções customizadas para o SharePoint 2010, é muito comum aparecer no Heath Analyzer a mensagem de erro a seguir:
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.
Na maioria dos casos esse erro é gerado por algum Event Receiver problemático, ou seja, que tenha sido esquecido de remover da solução customizada, ou outro problema relacionado com a desativação ou retração da solução.
Neste post eu quero compartilhar com vocês um script Power Shell que pode ajudá-los a remover esse event receiver problemático.
Este artigo é uma tradução livre do artigo MissingAssembly Error in Health Analyzer ( https://blogs.technet.com/b/pfelatam/archive/2013/06/26/missingassembly-error-in-health-analyzer.aspx )
O script a seguir possui 2 funções:
Delete-MissingAssembly: Esta é a função principal que percorre todos os possíveis containers no banco de dados específicos que podem hospedar um event receiver: site collections, web ou listas.
Remove-EventReceiver: Essa função verifica se o container do event receiver possui qualquer event receiver com o nome do assembly específico, exibe suas informações e/ou tenta excluí-lo.
As 2 funções tem um parâmetro para permitir excluir diretamente o event receiver ou apenas mostra na tela as informações sobre ele.
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."
}
}
}
}
Depois de salvar o script em um arquivo PS1 e importá-lo (Exemplo: Import-Module .\MissingEV.PS1), você pode usar essa função da seguinte forma:
Delete-MissingAssembly -ContentDb WSS_Content -Assembly "My.Assembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cfc9a4dcd383ae1e" -ReportOnly
E a mensagem exibida será parecida com essa:
Como você pode ver a função exibe o Id, Nome, Tipo e Local do event receiver específico, você pode decidir se irá removê-lo com esse script, acessar através do PowerShell ou ainda através de alguma ferramenta de terceiros.
Espero que com este post tenha lhe ajudado a resolver a falta de dependência do lado do servidor que é exibida no Health Analyzer.