MissingAssembly Error in Health Analyzer

One of the most common issues in the Health Analyzer when you deploy custom solutions in your SharePoint 2010 environment, is this one:

 

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.

 

Most of the times this issue is regarding some bad Event Receivers that you forgot to remove before you delete the custom solution, or another problem related with the feature deactivation and solution retraction.

 

In this post I want to share with you a Power Shell script that can help you to remove this kind of bad Event Receivers.

 

The following script contains 2 functions:

 

Delete-MissingAssembly: This is the main function that goes through every possible container in the specific database that can host an Event Receiver, it means Site, Web or List.

 

Remove-EventReceiver: This function check if the event receiver container has any event receiver with the specific assembly name, shows his information and try to delete it.

 

Also the 2 functions has a parameter to allow directly delete the event receiver or only shows in the screen the information regarding the ER.

 

 

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."

                    }

             }

       }

}

 

 

After you save this script in a PS1 file and import it (Example: Import-Module .\MissingEV.PS1), you can use the function in the following way:

 

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

 

And the output could be:

 

 

As you can see the output of the Power Shell shows the Id, Name, Type and location of the specific event Receiver, you can decide if remove it with this script or access through PS or a 3rd tool to remove it.

 

Hope this helped you in the typically Missing server side dependencies issue in the Health Analyzer.