src/Solutions/Get-XrmSolutions.ps1

<#
    .SYNOPSIS
    Retrieve solutions records.

    .DESCRIPTION
    Get all solutions from instance with expected columns.

    .PARAMETER XrmClient
    Xrm connector initialized to target instance. Use latest one by default. (Dataverse ServiceClient)

    .PARAMETER Columns
    Specify expected columns to retrieve. (Default : id, uniquename, friendlyname, version, ismanaged, installedon, createdby, publisherid, modifiedon, modifiedby)

    .PARAMETER PublisherId
    Keep the solutions of this publisher. (Default: all)

    .PARAMETER VisibleOnly
    Keep the solutions shown in the maker portal (isvisible true): excludes the system solutions such as Active and Basic.

    .OUTPUTS
    PSCustomObject[]. Solution rows (XrmObject).

    .EXAMPLE
    $publisher = Get-XrmPublisher -XrmClient $xrmClient -PublisherUniqueName "contoso";
    $solutions = Get-XrmSolutions -XrmClient $xrmClient -PublisherId $publisher.Id -VisibleOnly -Columns "uniquename", "version";

    .LINK
    https://github.com/AymericM78/PowerDataOps/blob/main/documentation/commands/Get-XrmSolutions.md
#>

function Get-XrmSolutions {
    [CmdletBinding()]
    [OutputType([PSCustomObject[]])]
    param
    (
        [Parameter(Mandatory = $false, ValueFromPipeline)]
        [Microsoft.PowerPlatform.Dataverse.Client.ServiceClient]
        $XrmClient = $Global:XrmClient,

        [Parameter(Mandatory = $false)]
        [ValidateNotNullOrEmpty()]
        [String[]]
        $Columns = @("solutionid", "uniquename", "friendlyname", "version", "ismanaged", "installedon", "createdby", "publisherid", "modifiedon", "modifiedby"),

        [Parameter(Mandatory = $false)]
        [ValidateNotNullOrEmpty()]
        [Guid]
        $PublisherId,

        [Parameter(Mandatory = $false)]
        [switch]
        $VisibleOnly
    )
    begin {   
        $StopWatch = [System.Diagnostics.Stopwatch]::StartNew(); 
        Trace-XrmFunction -Name $MyInvocation.MyCommand.Name -Stage Start -Parameters ($MyInvocation.MyCommand.Parameters); 
    }    
    process {
        $querySolutions = New-XrmQueryExpression -LogicalName "solution" -Columns $Columns;
        if ($PSBoundParameters.ContainsKey('PublisherId')) {
            $querySolutions = $querySolutions | Add-XrmQueryCondition -Field "publisherid" -Condition Equal -Values $PublisherId;
        }
        if ($VisibleOnly) {
            $querySolutions = $querySolutions | Add-XrmQueryCondition -Field "isvisible" -Condition Equal -Values $true;
        }
        $solutions = $XrmClient | Get-XrmMultipleRecords -Query $querySolutions;
        $solutions;        
    }
    end {
        $StopWatch.Stop();
        Trace-XrmFunction -Name $MyInvocation.MyCommand.Name -Stage Stop -StopWatch $StopWatch;
    }    
}

Export-ModuleMember -Function Get-XrmSolutions -Alias *;