Private/Groups.SecurityDistribution.ps1

function Get-M365SnapshotSecurityAndDistributionGroups {
    param(
        [Parameter(Mandatory=$false)]
        [AllowNull()]
        [hashtable]$GraphHeaders,

        [Parameter(Mandatory=$true)]
        [object[]]$Groups,

        [Parameter(Mandatory=$true)]
        [ValidateRange(1, [int]::MaxValue)]
        [int]$EffectiveMaxSecurityDistributionGroups,

        [Parameter(Mandatory=$true)]
        [switch]$ReturnObjects
    )

    $securityGroups = @()
    $distributionGroups = @()

    try {
        foreach ($group in @($Groups)) {
            $groupTypesText = [string]$group.GroupTypes
            $isUnified = ($groupTypesText -match '(^|,\s*)Unified($|,\s*)')

            if ($isUnified) {
                continue
            }

            $isSecurityEnabled = [bool]$group.SecurityEnabled
            $isMailEnabled = [bool]$group.MailEnabled

            $groupRecord = [PSCustomObject]@{
                DisplayName = $group.DisplayName
                PrimarySmtpAddress = $group.PrimarySmtpAddress
                GroupId = $group.GroupId
                MailEnabled = $isMailEnabled
                SecurityEnabled = $isSecurityEnabled
                GroupTypes = $group.GroupTypes
                OwnerCount = if ($null -ne $group.OwnerCount) { [int]$group.OwnerCount } else { $null }
                SharingType = $group.SharingType
                Label = $group.Label
                Site = $group.Site
                MemberCount = if ($null -ne $group.MemberCount) { [int]$group.MemberCount } else { $null }
            }

            if ($isSecurityEnabled) {
                $securityGroups += $groupRecord
            }

            if ($isMailEnabled -and -not $isSecurityEnabled) {
                $distributionGroups += $groupRecord
            }
        }

        $securityGroups = @($securityGroups | Select-Object -First $EffectiveMaxSecurityDistributionGroups)
        $distributionGroups = @($distributionGroups | Select-Object -First $EffectiveMaxSecurityDistributionGroups)

        if (-not $ReturnObjects) {
            Write-Host "[OK] Found $($securityGroups.Count) security group(s) and $($distributionGroups.Count) distribution group(s)`n" -ForegroundColor Green
        }
    }
    catch {
        if (-not $ReturnObjects) {
            Write-Host "[WARNING] Could not classify security/distribution groups: $($_.Exception.Message)`n" -ForegroundColor Yellow
        }
    }

    return [PSCustomObject]@{
        SecurityGroups = @($securityGroups)
        DistributionGroups = @($distributionGroups)
    }
}