Shared/Set-LogPropertiesVisibility.psm1

Function Set-LogPropertiesVisibility {
    <#
    .SYNOPSIS
    Sets the properties to be visible in the output of the Out-GridView cmdlet.
    .PARAMETER LogType
        The type of log file to be displayed.
    .PARAMETER EventsToDisplay
        The event objects whose properties visibility are to be configured.
    .INPUTS
        PSCustomObject[]
        System.String
    .OUTPUTS
        System.Void
    #>

    [CmdletBinding()]
    Param (
        [ValidateSet('Evtx/Local', 'MDEAH')]
        [Parameter(Mandatory = $true)][System.String]$LogType,
        [Parameter(Mandatory = $true)][PSCustomObject[]]$EventsToDisplay
    )
    Begin {
        Switch ($LogType) {
            'Evtx/Local' {
                [System.String[]]$PropertiesToDisplay = @('TimeCreated', 'File Name', 'Full Path', 'Process Name', 'ProductName', 'OriginalFileName', 'InternalName', 'PackageFamilyName', 'FileVersion', 'Publishers', 'PolicyName', 'SI Signing Scenario')
            }
            'MDEAH' {
                [System.String[]]$PropertiesToDisplay = @('TimeStamp', 'DeviceName', 'FileName', 'FolderPath', 'InitiatingProcessFileName', 'SignatureStatus', 'PolicyName', 'OriginalFileName', 'InternalName', 'PackageFamilyName', 'FileVersion', 'Type', 'SISigningScenario')
            }
        }
    }
    Process {
        # Create a PSPropertySet object that contains the names of the properties to be visible
        # Used for Out-GridView display
        # https://learn.microsoft.com/en-us/dotnet/api/system.management.automation.pspropertyset
        # https://learn.microsoft.com/en-us/powershell/scripting/learn/deep-dives/everything-about-pscustomobject#using-defaultpropertyset-the-long-way
        $Visible = [System.Management.Automation.PSPropertySet]::new(
            'DefaultDisplayPropertySet', # the name of the property set
            $PropertiesToDisplay # the names of the properties to be visible
        )

        # Add the PSPropertySet object to the PSStandardMembers member set of each element of the $EventsToDisplay array
        foreach ($Element in $EventsToDisplay) {
            $Element | Add-Member -MemberType 'MemberSet' -Name 'PSStandardMembers' -Value $Visible
        }
    }
}
Export-ModuleMember -Function 'Set-LogPropertiesVisibility'