Module/Administration/Export-BCSInstalledAppsPerTenant.ps1

<#
.SYNOPSIS
 
.DESCRIPTION
 
.EXAMPLE
 
.NOTES
    Author: Mathias Stjernfelt
    Website: http://www.brightcom.se
#>

function Export-BCSInstalledAppsPerTenant {
    Param (
        [Parameter(ValueFromPipelineByPropertyName, Mandatory = $true)]
        [string]$OutputFilename,
        [Parameter(ValueFromPipelineByPropertyName, Mandatory = $false)]
        [string]$OutputDirectory,
        [Parameter(ValueFromPipelineByPropertyName, Mandatory = $false)]
        [string]$ServerInstance,
        [Parameter(ValueFromPipelineByPropertyName, Mandatory = $false)]
        [ValidateSet('Console', 'File')]
        [string]$OutputTo = 'Console',
        [Parameter(Mandatory = $False)]
        [switch]$Append
    )
    begin {}

    process {
        $OutFileCsv = ("{0}\{1}" -f $OutputDirectory, $OutputFilename);

        if ($a) {
            $a.Clear()
        }

        if ($Append -eq $False) {
            if (Test-Path $OutFileCsv) {
                Remove-Item $OutFileCsv;
            }
        }
        Import-BCSDynamicsNavModules -ServerInstance $serverInstance

        $ServerInstanceVersion = Get-NAVServerInstance -ServerInstance $ServerInstance | Select-Object -Property Version;
        $ServerInstanceVersion = $ServerInstanceVersion.Version.Split('.')[0];

        $tenants = Get-NAVAppTenant -ServerInstance $ServerInstance | Select-Object -Property Id;

        $a = @();

        foreach ($tenant in $tenants) {

            $apps = Get-NAVAppInfo -ServerInstance $ServerInstance -Tenant $tenant.Id -TenantSpecificProperties

            foreach ($app in $apps) {
                $NameVersion = ("{0}{1}" -f $app.Name, $app.Version);

                $item = New-Object PSObject
                $item | Add-Member -type NoteProperty -Name 'ServerInstance' -Value $ServerInstance;
                $item | Add-Member -type NoteProperty -Name 'BCVersion' -Value $ServerInstanceVersion;
                $item | Add-Member -type NoteProperty -Name 'Tenant' -Value $tenant.Id
                $item | Add-Member -type NoteProperty -Name 'Name' -Value $app.Name
                $item | Add-Member -type NoteProperty -Name 'Publisher' -Value $app.Publisher
                $item | Add-Member -type NoteProperty -Name 'Version' -Value $app.Version
                $item | Add-Member -type NoteProperty -Name 'Scope' -Value $app.Scope
                $item | Add-Member -type NoteProperty -Name 'IsInstalled' -Value $app.IsInstalled
                $item | Add-Member -type NoteProperty -Name 'IsPublished' -Value $app.IsPublished
                $item | Add-Member -type NoteProperty -Name 'SyncState' -Value $app.SyncState
                $item | Add-Member -type NoteProperty -Name 'NameVersion' -Value $NameVersion
                $item | Add-Member -type NoteProperty -Name 'AppID' -Value $app.AppId

                $a += $item
            }
        }

        $output = $a | Sort-Object Tenant, Name

        if ($OutputTo -eq 'Console') {
            $output
        }
        elseif ($OutputTo -eq 'File') {
            if ($Append -eq $False) {
                $output | Export-Csv -Path $OutFileCsv -Encoding utf8 -Delimiter ';' -NoTypeInformation   
            }
            else {
                $output | Export-Csv -Path $OutFileCsv -Encoding utf8 -Delimiter ';' -Append -NoTypeInformation
            }
        }
    }

    end {
    }
}

Export-ModuleMember -Function Export-BCSInstalledAppsPerTenant