List all CustomActions in the Farm

Here’s a great little script that I used to list out all of the Custom Actions available in a farm.  What’s great about the script is that it returns the CustomActions in XML so you can vary the output.  My favorite is using the Out-GridView cmdlet in Windows PowerShell 2.0. From there can you can do searches, sorts, filters, etc.

Calling the Script

PS C:\>  [xml]$ca = Get-SPCustomAction   

PS C:\>  $ca.CustomActions.CustomAction | Out-GridView

The Function

function Get-SPCustomAction
{  
    trap [Exception] { continue; }
    cls
    $null = [system.reflection.assembly]::loadwithpartialname("Microsoft.Sharepoint")
    $null = [system.reflection.assembly]::loadwithpartialname("Microsoft.Sharepoint.Administration")
    $null = [system.reflection.assembly]::loadwithpartialname("System.Web")
    [string]$xmlString = "<?xml version=""1.0"" encoding=""utf-8"" ?><CustomActions>"
    $farm = [microsoft.sharepoint.administration.spfarm]::local
    foreach ($featureDef in $farm.FeatureDefinitions)
    {
        trap [Exception] { continue; }
        foreach ($elementDef in $featureDef.GetElementDefinitions([System.Globalization.CultureInfo]::CurrentCulture))
        {
            trap [Exception] { continue; }
            $node = $elementDef.XmlDefinition;
            if ($node.Name -eq "CustomAction")
            {
                trap [Exception] { write-error $($_.Exception.Message); continue; }
                $xmlString += "<CustomAction Id=""" + $node.Id + """ GroupId=""" + $node.GroupId + """ Location=""" + $node.Location + """ Sequence=""" + $node.Sequence + """ Title=""" + $node.Title + """ "
                if($node.UrlAction -ne $null -and $node.UrlAction.OuterXml -ne "" -and $node.UrlAction.Url -ne $null -and $node.UrlAction.Url -ne "")
                {
                    $xmlString +=  "Url=""" + [System.Web.HttpUtility]::UrlEncode($node.UrlAction.Url.ToString()) + """ "
                }
                $xmlString += "
xmlns=""https://schemas.microsoft.com/sharepoint/""/>"
            }
        }
    } 

    $xmlString += "</CustomActions>"

    #$xmlString = $xmlString.Replace("&", " ")
    Write-Output  $xmlString
}

Then you can filter down to a “Location” and do a partial name “Id” search for what you might be looking for. 

CustomActionsGridView