Public/Get-ADGroupsAndMembers.ps1

function Get-ADGroupsAndMembers {
    [CmdletBinding()]
    param(
        [switch]$Export,
        [string]$ExportPath = $script:Config.ExportPath
    )
    
    try {
        Write-Log "Retrieving groups and members..." -Level Info
        Show-ProgressHelper -Activity "AD Inventory" -Status "Initializing group retrieval..."
        
        Show-ProgressHelper -Activity "AD Inventory" -Status "Getting groups..."
        
        $groups = Invoke-WithRetry -ScriptBlock {
            Get-ADGroup -Filter * -Properties Members, Description, Info, Created, Modified -ErrorAction Stop
        }
        
        $groupObjects = Get-ADObjects -ObjectType "Groups" -Objects $groups -ProcessingScript {
            param($group)
            
            $members = $null
            if ($group.Members) {
                $memberNames = foreach ($memberDN in $group.Members) {
                    try {
                        $member = Invoke-WithRetry -ScriptBlock {
                            Get-ADObject $memberDN -Properties name -ErrorAction Stop
                        }
                        $member.Name
                    }
                    catch {
                        Write-Log "Could not resolve member $memberDN" -Level Warning
                        "Unknown Member"
                    }
                }
                $members = $memberNames -join "; "
            }
            
            [PSCustomObject]@{
                Name              = $group.Name
                Description       = $group.Description
                MemberCount       = ($group.Members | Measure-Object).Count
                Members           = $members
                Created           = $group.Created
                Modified          = $group.Modified
                DistinguishedName = $group.DistinguishedName
            }
        }
        
        if ($Export) {
            Show-ProgressHelper -Activity "AD Inventory" -Status "Exporting group data..."
            if (-not (Test-Path $ExportPath)) {
                New-Item -ItemType Directory -Path $ExportPath -Force
            }
            $exportFile = Join-Path $ExportPath "Groups_$(Get-Date -Format 'yyyyMMdd_HHmmss').csv"
            $groupObjects | Export-Csv $exportFile -NoTypeInformation
            Write-Log "Groups exported to $exportFile" -Level Info
        }
        
        Show-ProgressHelper -Activity "AD Inventory" -Status "Group retrieval complete" -Completed
        return $groupObjects
        
    }
    catch {
        Write-Log "Error retrieving groups: $($_.Exception.Message)" -Level Error
        Show-ErrorBox "Unable to retrieve groups or group members. Check permissions."
    }
}