Modules/Public/InventoryModules/Monitor/ActionGroups.ps1

<#
.Synopsis
Inventory for Azure Monitor Action Groups
 
.DESCRIPTION
This script consolidates information for all Azure Monitor action groups.
Captures notification channels, receivers, and alert routing configurations.
Excel Sheet Name: Action Groups
 
.Link
https://github.com/thisismydemo/azure-scout/Modules/Public/InventoryModules/Monitoring/ActionGroups.ps1
 
.COMPONENT
    This PowerShell Module is part of Azure Scout (AZSC).
 
.CATEGORY Monitor
 
.NOTES
Version: 1.0.0
First Release Date: February 24, 2026
Authors: AzureScout Contributors
 
#>


<######## Default Parameters. Don't modify this ########>

param($SCPath, $Sub, $Intag, $Resources, $Retirements, $Task ,$File, $SmaResources, $TableStyle, $Unsupported)

If ($Task -eq 'Processing')
{
    <######### Insert the resource extraction here ########>

        $actionGroups = $Resources | Where-Object {$_.TYPE -eq 'microsoft.insights/actiongroups'}

    <######### Insert the resource Process here ########>

    if($actionGroups)
        {
            $tmp = foreach ($1 in $actionGroups) {
                $ResUCount = 1
                $sub1 = $SUB | Where-Object { $_.Id -eq $1.subscriptionId }
                $data = $1.PROPERTIES
                $Tags = if(![string]::IsNullOrEmpty($1.tags.psobject.properties)){$1.tags.psobject.properties}else{'0'}

                # Parse email receivers
                $emailReceivers = @()
                if ($data.emailReceivers) {
                    foreach ($email in $data.emailReceivers) {
                        $emailReceivers += "$($email.name): $($email.emailAddress)"
                    }
                }
                $emailStr = if ($emailReceivers.Count -gt 0) { $emailReceivers -join '; ' } else { 'None' }

                # Parse SMS receivers
                $smsReceivers = @()
                if ($data.smsReceivers) {
                    foreach ($sms in $data.smsReceivers) {
                        $smsReceivers += "$($sms.name): $($sms.countryCode)-$($sms.phoneNumber)"
                    }
                }
                $smsStr = if ($smsReceivers.Count -gt 0) { $smsReceivers -join '; ' } else { 'None' }

                # Parse webhook receivers
                $webhookReceivers = @()
                if ($data.webhookReceivers) {
                    foreach ($webhook in $data.webhookReceivers) {
                        $webhookReceivers += "$($webhook.name): $($webhook.serviceUri)"
                    }
                }
                $webhookStr = if ($webhookReceivers.Count -gt 0) { $webhookReceivers -join '; ' } else { 'None' }

                # Parse Azure app push receivers
                $appPushReceivers = @()
                if ($data.azureAppPushReceivers) {
                    foreach ($push in $data.azureAppPushReceivers) {
                        $appPushReceivers += "$($push.name): $($push.emailAddress)"
                    }
                }
                $appPushStr = if ($appPushReceivers.Count -gt 0) { $appPushReceivers -join '; ' } else { 'None' }

                # Parse automation runbook receivers
                $runbookReceivers = @()
                if ($data.automationRunbookReceivers) {
                    foreach ($runbook in $data.automationRunbookReceivers) {
                        $runbookReceivers += "$($runbook.name): $($runbook.runbookName)"
                    }
                }
                $runbookStr = if ($runbookReceivers.Count -gt 0) { $runbookReceivers -join '; ' } else { 'None' }

                # Parse Azure Function receivers
                $functionReceivers = @()
                if ($data.azureFunctionReceivers) {
                    foreach ($func in $data.azureFunctionReceivers) {
                        $functionReceivers += "$($func.name): $($func.functionName)"
                    }
                }
                $functionStr = if ($functionReceivers.Count -gt 0) { $functionReceivers -join '; ' } else { 'None' }

                # Parse Logic App receivers
                $logicAppReceivers = @()
                if ($data.logicAppReceivers) {
                    foreach ($logic in $data.logicAppReceivers) {
                        $logicAppReceivers += "$($logic.name): $($logic.resourceId -split '/')[-1]"
                    }
                }
                $logicAppStr = if ($logicAppReceivers.Count -gt 0) { $logicAppReceivers -join '; ' } else { 'None' }

                # Get enabled status
                $enabled = if ($data.enabled -eq $true) { 'Enabled' } else { 'Disabled' }

                foreach ($Tag in $Tags) {
                    $obj = @{
                        'ID'                        = $1.id;
                        'Subscription'              = $sub1.Name;
                        'Resource Group'            = $1.RESOURCEGROUP;
                        'Action Group Name'         = $1.NAME;
                        'Short Name'                = if ($data.groupShortName) { $data.groupShortName } else { 'N/A' };
                        'Location'                  = $1.LOCATION;
                        'Status'                    = $enabled;
                        'Email Receivers'           = $emailStr;
                        'SMS Receivers'             = $smsStr;
                        'Webhook Receivers'         = $webhookStr;
                        'Azure App Push'            = $appPushStr;
                        'Automation Runbooks'       = $runbookStr;
                        'Azure Functions'           = $functionStr;
                        'Logic Apps'                = $logicAppStr;
                        'Total Receivers'           = ($emailReceivers.Count + $smsReceivers.Count + $webhookReceivers.Count + $appPushReceivers.Count + $runbookReceivers.Count + $functionReceivers.Count + $logicAppReceivers.Count);
                        'Resource U'                = $ResUCount;
                        'Tag Name'                  = [string]$Tag.Name;
                        'Tag Value'                 = [string]$Tag.Value
                    }
                    $obj
                    if ($ResUCount -eq 1) { $ResUCount = 0 }
                }
            }
            $tmp
        }
}

<######## Resource Excel Reporting Begins Here ########>

Else
{
    <######## $SmaResources.(RESOURCE FILE NAME) ##########>

    if($SmaResources)
    {

        $TableName = ('ActionGroupsTable_'+(($SmaResources.'Resource U' | Measure-Object -Sum).Sum))
        $Style = New-ExcelStyle -HorizontalAlignment Center -AutoSize -NumberFormat '0'
        $StyleExt = New-ExcelStyle -HorizontalAlignment Left -Range H:N -Width 40 -WrapText

        $Exc = New-Object System.Collections.Generic.List[System.Object]
        $Exc.Add('Subscription')
        $Exc.Add('Resource Group')
        $Exc.Add('Action Group Name')
        $Exc.Add('Short Name')
        $Exc.Add('Location')
        $Exc.Add('Status')
        $Exc.Add('Email Receivers')
        $Exc.Add('SMS Receivers')
        $Exc.Add('Webhook Receivers')
        $Exc.Add('Azure App Push')
        $Exc.Add('Automation Runbooks')
        $Exc.Add('Azure Functions')
        $Exc.Add('Logic Apps')
        $Exc.Add('Total Receivers')
        if($InTag)
            {
                $Exc.Add('Tag Name')
                $Exc.Add('Tag Value')
            }
        $Exc.Add('Resource U')

        [PSCustomObject]$SmaResources |
        ForEach-Object { $_ } | Select-Object $Exc |
        Export-Excel -Path $File -WorksheetName 'Action Groups' -AutoSize -MaxAutoSizeRows 100 -TableName $TableName -TableStyle $tableStyle -Style $Style, $StyleExt

    }
}