Modules/Public/InventoryModules/Management/LighthouseDelegations.ps1

<#
.Synopsis
Inventory for Azure Lighthouse Delegations
 
.DESCRIPTION
This script consolidates information for all Azure Lighthouse delegations.
Captures service provider access, delegated permissions, and managed tenant relationships.
Excel Sheet Name: Lighthouse Delegations
 
.Link
https://github.com/thisismydemo/azure-scout/Modules/Public/InventoryModules/Management/LighthouseDelegations.ps1
 
.COMPONENT
    This PowerShell Module is part of Azure Scout (AZSC).
 
.CATEGORY Management
 
.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 ########>

        $lighthouseDelegations = $Resources | Where-Object {$_.TYPE -eq 'Microsoft.ManagedServices/registrationDefinitions'}

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

    if($lighthouseDelegations)
        {
            $tmp = foreach ($1 in $lighthouseDelegations) {
                $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'}

                # Get registration details
                $registrationId = if ($data.registrationId) { $data.registrationId } else { 'N/A' }
                $description = if ($data.description) { $data.description } else { 'N/A' }

                # Get managing tenant
                $managedByTenantId = if ($data.managedByTenantId) { $data.managedByTenantId } else { 'N/A' }
                $managedByTenantName = if ($data.managedByTenantName) { $data.managedByTenantName } else { 'N/A' }

                # Parse authorizations (delegated permissions)
                $authorizations = @()
                if ($data.authorizations) {
                    foreach ($auth in $data.authorizations) {
                        $principalId = $auth.principalId
                        $principalIdDisplayName = if ($auth.principalIdDisplayName) {
                            $auth.principalIdDisplayName
                        } else { $principalId }
                        $roleDefinitionId = ($auth.roleDefinitionId -split '/')[-1]

                        # Map common role definition GUIDs to friendly names
                        $roleName = switch ($roleDefinitionId) {
                            'b24988ac-6180-42a0-ab88-20f7382dd24c' { 'Contributor' }
                            '8e3af657-a8ff-443c-a75c-2fe8c4bcb635' { 'Owner' }
                            'acdd72a7-3385-48ef-bd42-f606fba81ae7' { 'Reader' }
                            '749f88d5-cbae-40b8-bcfc-e573ddc772fa' { 'Monitoring Contributor' }
                            '43d0d8ad-25c7-4714-9337-8ba259a9fe05' { 'Monitoring Reader' }
                            '92aaf0da-9dab-42b6-94a3-d43ce8d16293' { 'Log Analytics Contributor' }
                            default { $roleDefinitionId }
                        }

                        $delegationType = if ($auth.delegatedRoleDefinitionIds) {
                            'Eligible (JIT)'
                        } else { 'Permanent' }

                        $authorizations += "$principalIdDisplayName -> $roleName ($delegationType)"
                    }
                }
                $authStr = if ($authorizations.Count -gt 0) { $authorizations -join '; ' } else { 'None' }

                # Get provisioning state
                $provisioningState = if ($data.provisioningState) { $data.provisioningState } else { 'Unknown' }

                # Check eligibility authorizations
                $eligibleAuthCount = 0
                if ($data.eligibleAuthorizations) {
                    $eligibleAuthCount = $data.eligibleAuthorizations.Count
                }

                foreach ($Tag in $Tags) {
                    $obj = @{
                        'ID'                        = $1.id;
                        'Subscription'              = $sub1.Name;
                        'Registration Name'         = $1.NAME;
                        'Description'               = $description;
                        'Registration ID'           = $registrationId;
                        'Managed By Tenant ID'      = $managedByTenantId;
                        'Managed By Tenant Name'    = $managedByTenantName;
                        'Authorizations'            = $authStr;
                        'Authorization Count'       = $authorizations.Count;
                        'Eligible Authorizations'   = $eligibleAuthCount;
                        'Provisioning State'        = $provisioningState;
                        '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 = ('LighthouseTable_'+(($SmaResources.'Resource U' | Measure-Object -Sum).Sum))
        $Style = New-ExcelStyle -HorizontalAlignment Center -AutoSize -NumberFormat '0'
        $StyleExt = New-ExcelStyle -HorizontalAlignment Left -Range D:D,H:H -Width 50 -WrapText

        $Exc = New-Object System.Collections.Generic.List[System.Object]
        $Exc.Add('Subscription')
        $Exc.Add('Registration Name')
        $Exc.Add('Description')
        $Exc.Add('Registration ID')
        $Exc.Add('Managed By Tenant ID')
        $Exc.Add('Managed By Tenant Name')
        $Exc.Add('Authorizations')
        $Exc.Add('Authorization Count')
        $Exc.Add('Eligible Authorizations')
        $Exc.Add('Provisioning State')
        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 'Lighthouse Delegations' -AutoSize -MaxAutoSizeRows 100 -TableName $TableName -TableStyle $tableStyle -Style $Style, $StyleExt

    }
}