Public/DomainReport/Objects/Get-ADGroupsAndMembers.ps1

function Get-ADGroupsAndMembers {
    [CmdletBinding()]
    param(
        [string]$ObjectType = "Groups",
        [System.Management.Automation.PSCredential]$Credential
    )
    
    try {
        Write-Log "Retrieving groups and members from AD..." -Level Info

        # Define the filter (all groups)
        $filter = '*'

        # Define the properties to retrieve (adjust as needed)
        $properties = @(
            'Name',
            'Description',
            'GroupCategory',
            'GroupScope',
            'Members',
            'Created',
            'Modified',
            'DistinguishedName'
        )

        # Define the processing script for each group
        $processingScript = {
            param($group)

            $totalNestedMemberCount = if ($group.Members) { $group.Members.Count } else { 0 }

            $groupObject = [PSCustomObject]@{
                Name                   = $group.Name
                Description            = $group.Description
                GroupCategory          = $group.GroupCategory
                GroupScope             = $group.GroupScope
                TotalNestedMemberCount = $totalNestedMemberCount
                Members                = $group.Members
                Created                = $group.Created
                Modified               = $group.Modified
                DistinguishedName      = $group.DistinguishedName
                AccessStatus           = "Success"
            }

            # Add a ToString method for better readability
            Add-Member -InputObject $groupObject -MemberType ScriptMethod -Name "ToString" -Value {
                "Name=$($this.Name); Category=$($this.GroupCategory); Scope=$($this.GroupScope); Members=$($this.TotalNestedMemberCount)"
            } -Force

            $groupObject
        }

        # Invoke the helper function
        return Invoke-ADRetrievalWithProgress -ObjectType $ObjectType `
            -Filter $filter `
            -Properties $properties `
            -Credential $Credential `
            -ProcessingScript $processingScript `
            -ActivityName "Retrieving Groups"
    }
    catch {
        Write-Log "Error retrieving groups: $($_.Exception.Message)" -Level Error
    }
}