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 ( http://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:

clip_image002

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.