Public/New-NSPPkiShim.ps1

function New-NSPPkiShim {
    <#
    .SYNOPSIS
        Writes a launcher script for PKI Manager - optionally carrying a client's CA answers - to drop
        on the issuing CA and run.
 
    .DESCRIPTION
        The launcher installs NSP.PKI (this version or newer) and the NSP modules it uses from the
        PowerShell Gallery, hands the answers to Start-NSPPkiManager once, blanks them from its own
        file, and starts the dashboard. See New-NSPToolShim (NSP.ClientScripts).
 
    .PARAMETER Answers
        PKI answers (ConvertTo-NSPPkiAnswers output), a hashtable, or a JSON string. Optional.
 
    .PARAMETER ClientAnswers
        A ClientAnswers object or file instead of -Answers; converted with ConvertTo-NSPPkiAnswers.
 
    .PARAMETER Path
        Where to write the launcher (.ps1).
 
    .PARAMETER Company
        Shown in the launcher header; defaults to the answers' Company_Name.
 
    .PARAMETER GeneratedBy
        Shown in the launcher header, e.g. 'Orchestrator 4.1.0'.
 
    .PARAMETER Force
        Overwrite an existing file.
 
    .EXAMPLE
        New-NSPPkiShim -ClientAnswers 'C:\...\ClientAnswers\EXAMPLE.json' -Path C:\Temp\PKI-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-NSPPkiAnswers -ClientAnswers $ClientAnswers
        if ($null -eq $Answers) { throw 'That client does not use certificate authentication (AuthMethod is not Certificate) - there is nothing for PKI Manager.' }
    }
    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) {
        foreach ($key in 'Company_Name', 'CompanyName') {
            $value = if ($Answers -is [Collections.IDictionary]) { [string]$Answers[$key] } elseif ($Answers.PSObject.Properties[$key]) { [string]$Answers.$key } else { '' }
            if ($value) { $Company = $value; break }
        }
    }

    $version = Get-NSPPkiModuleVersion
    $shim = @{
        ToolName             = 'PKI Manager'
        ModuleName           = 'NSP.PKI'
        ModuleMinimumVersion = $version
        EntryFunction        = 'Start-NSPPkiManager'
        Modules              = @(
            @{ Name = 'NSP.Console'; MinimumVersion = '0.1.2' }
            @{ Name = 'NSP.Toolkit'; MinimumVersion = '0.1.0' }
            @{ Name = 'NSP.PKI'; 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 PKI Manager launcher')) {
        New-NSPToolShim @shim -Confirm:$false
    }
}