Public/New-NSPNpsShim.ps1

function New-NSPNpsShim {
    <#
    .SYNOPSIS
        Writes a launcher script for NPS Manager - optionally carrying a client's RADIUS answers - to
        drop on the NPS server and run.
 
    .DESCRIPTION
        The launcher installs NSP.NPS (this version or newer) and the NSP modules it uses from the
        PowerShell Gallery, hands the answers to Start-NSPNpsManager once, blanks them from its own
        file (they include the RADIUS shared secret), and starts the dashboard. See New-NSPToolShim
        (NSP.ClientScripts).
 
    .PARAMETER Answers
        NPS answers (ConvertTo-NSPNpsAnswers output), a hashtable, or a JSON string. Optional.
 
    .PARAMETER ClientAnswers
        A ClientAnswers object or file instead of -Answers; converted with ConvertTo-NSPNpsAnswers.
 
    .PARAMETER Path
        Where to write the launcher (.ps1).
 
    .PARAMETER Company
        Shown in the launcher header; defaults to the answers' CompanyName.
 
    .PARAMETER GeneratedBy
        Shown in the launcher header, e.g. 'Orchestrator 4.1.0'.
 
    .PARAMETER Force
        Overwrite an existing file.
 
    .EXAMPLE
        New-NSPNpsShim -ClientAnswers 'C:\...\ClientAnswers\EXAMPLE.json' -Path C:\Temp\NPS-Manager.ps1
    #>

    [CmdletBinding(SupportsShouldProcess, DefaultParameterSetName = 'Answers')]
    [OutputType([IO.FileInfo])]
    param(
        [Parameter(ParameterSetName = 'Answers')][object]$Answers,
        [Parameter(Mandatory, ParameterSetName = 'ClientAnswers')][object]$ClientAnswers,
        [Parameter(Mandatory)][string]$Path,
        [string]$Company,
        [string]$GeneratedBy,
        [switch]$Force
    )

    Import-NSPToolkitModule -Name NSP.ClientScripts -MinimumVersion 0.1.0
    if ($PSCmdlet.ParameterSetName -eq 'ClientAnswers') {
        $Answers = ConvertTo-NSPNpsAnswers -ClientAnswers $ClientAnswers
        if ($null -eq $Answers) { throw 'That client does not use RADIUS (AuthType is not RADIUS) - there is nothing for NPS Manager.' }
        if (-not $Answers.IsComplete) { Write-Warning 'These RADIUS answers are incomplete (placeholder FortiGate IP, or no secret or user group).' }
    }
    if ($Answers -is [string]) {
        try { $Answers = ConvertFrom-Json -InputObject $Answers -ErrorAction Stop }
        catch { throw "-Answers is not valid JSON: $($_.Exception.Message)" }
    }
    if (-not $Company -and $Answers) {
        $Company = if ($Answers -is [Collections.IDictionary]) { [string]$Answers['CompanyName'] } elseif ($Answers.PSObject.Properties['CompanyName']) { [string]$Answers.CompanyName } else { '' }
    }

    $version = Get-NSPNpsModuleVersion
    $shim = @{
        ToolName             = 'NPS Manager'
        ModuleName           = 'NSP.NPS'
        ModuleMinimumVersion = $version
        EntryFunction        = 'Start-NSPNpsManager'
        Modules              = @(
            @{ Name = 'NSP.Console'; MinimumVersion = '0.1.2' }
            @{ Name = 'NSP.Toolkit'; MinimumVersion = '0.1.0' }
            @{ Name = 'NSP.NPS'; MinimumVersion = $version }
        )
        Path                 = $Path
        Force                = $Force
    }
    if ($null -ne $Answers) { $shim['SeedAnswers'] = $Answers }
    if ($Company) { $shim['Company'] = $Company }
    if ($GeneratedBy) { $shim['GeneratedBy'] = $GeneratedBy }

    if ($PSCmdlet.ShouldProcess($Path, 'Write NPS Manager launcher')) {
        New-NSPToolShim @shim -Confirm:$false
    }
}