private/output/ConvertTo-SafeDataArray.ps1

function ConvertTo-SafeDataArray {
    <#
    .SYNOPSIS
        Converts data array to a safe format for DataGrid display. Protects against
        properties that throw exceptions on access.
    #>

    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [object[]]$DataArray
    )

    # Sample first few items to check if conversion is needed
    $needsSafeConversion = $false
    $sampleSize = [Math]::Min(5, $DataArray.Count)

    for ($i = 0; $i -lt $sampleSize; $i++) {
        $sample = $DataArray[$i]
        if ($null -eq $sample) { continue }
        if ($sample -is [string] -or $sample -is [ValueType]) { continue }
        if ($sample -is [System.Collections.IDictionary]) { continue }
        if ($sample -is [System.Management.Automation.PSCustomObject]) { continue }

        # Test a few properties on this sample
        try {
            $propCount = 0
            foreach ($prop in $sample.PSObject.Properties) {
                $null = $prop.Value
                $propCount++
                if ($propCount -ge 3) { break }
            }
        }
        catch {
            $needsSafeConversion = $true
            break
        }
    }

    # Return original if no conversion needed (wrap in , to preserve array)
    if (!$needsSafeConversion) { return ,$DataArray }

    # Build safe copies with exception-protected property access
    $safeDataArray = @(foreach ($item in $DataArray) {
        try {
            if ($null -eq $item) { continue }
            if ($item -is [string] -or $item -is [ValueType]) { $item; continue }
            if ($item -is [System.Collections.IDictionary]) { $item; continue }
            if ($item -is [System.Management.Automation.PSCustomObject]) { $item; continue }

            $safeProps = [ordered]@{}
            foreach ($prop in $item.PSObject.Properties) {
                try { $safeProps[$prop.Name] = $prop.Value }
                catch { $safeProps[$prop.Name] = '[Access Denied]' }
            }
            [PSCustomObject]$safeProps
        }
        catch { $item }
    })

    if ($safeDataArray.Count -gt 0) { return $safeDataArray }
    return $DataArray
}