With the General Availability (GA) of PowerShell 7, it is time to think about updating our MDT Reference Images. Furthermore the increasing number of remote backends that require a minimum TLS 1.2 for remote connections with for example Invoke-WebRequest like PowerShell Gallery and several other JSON APIs.
Important! Evergreen uses Nuget which now requires TLS12. Add this to your Ref Images #automation Thx @xenadmin
"Powershell.exe Set-ItemProperty -Path 'HKLM:SOFTWAREMicrosoft.NetFrameworkv4.0.30319' -Name 'SchUseStrongCrypto' -Value '1' -Type DWord"
— Trond E Haavarstein (@xenappblog) April 19, 2020
Please ensure you uncomment the .NET command (line 39), if you haven’t enabled TLS 1.2 in your Reference Image, yet.
The results will look like this:

Please find the most up to date code in my GitHub repository.
Below is the code also embedded for further reference.
<#
.SYNOPSIS
Evergreen Download & Setup Script for PowerShell Core Windows x64 MSI
.DESCRIPTION
Evergreen Download & Setup Script for PowerShell Core Windows x64 MSI
Created by Marco Hofmann in 2020
Blog: https://www.meinekleinefarm.net/
Twitter: @xenadmin
.EXAMPLE
Start from inside the working directory, to preserve the Version history structure:
PS C:\MDTBuildLab\Applications\Microsoft\PowerShell> .\Install_x86.ps1
.OUTPUTS
Will generate a log file in C:\Windows\Temp
Will generate an MSI archive in the Working directory with past versions.
.NOTES
GitHub JSON API requires TLS 1.2 for Invoke-WebRequest.
Ensure you uncomment the .NET command (line 39), if you haven't enabled TLS 1.2 in your Reference Image, yet.
.NOTES
PowerShell Wrapper for MDT, Standalone and Chocolatey Installation - (C)2015 xenappblog.com
Example 1: Start-Process "XenDesktopServerSetup.exe" -ArgumentList $unattendedArgs -Wait -Passthru
Example 2 Powershell: Start-Process powershell.exe -ExecutionPolicy bypass -file $Destination
Example 3 EXE (Always use ' '):
$UnattendedArgs='/qn'
(Start-Process "$PackageName.$InstallerType" $UnattendedArgs -Wait -Passthru).ExitCode
Example 4 MSI (Always use " "):
$UnattendedArgs = "/i $PackageName.$InstallerType ALLUSERS=1 /qn /liewa $LogApp"
(Start-Process msiexec.exe -ArgumentList $UnattendedArgs -Wait -Passthru).ExitCode
.LINK
Download and install latest Release of PowerShell
.LINK
https://github.com/xenadmin/applications/tree/master/Microsoft/PowerShell/
#>
Clear-Host
Write-Verbose "Setting Arguments" -Verbose
$StartDTM = (Get-Date)
# Ensures that Invoke-WebRequest uses TLS 1.2 - UNCOMMENT if you haven't enabled TLS1.2 in your reference image and are using PowerShell < 7.0
# [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
$arch = "x64"
$github = Invoke-WebRequest 'https://api.github.com/repos/PowerShell/PowerShell/releases/latest' -UseBasicParsing | ConvertFrom-Json
$url = $($github.assets | Where-Object -Property name -Like "*win-$arch.msi").browser_download_url
$Vendor = "Microsoft"
$Product = "PowerShell"
$Version = $($github.tag_name).Trim("v")
$PackageName = "PowerShell-$Version-win-$arch"
$InstallerType = "msi"
$Source = "$PackageName" + "." + "$InstallerType"
$LogPS = "${env:SystemRoot}" + "\Temp\$Vendor $Product $Version PS Wrapper.log"
$LogApp = "${env:SystemRoot}" + "\Temp\$PackageName.log"
$Destination = "${env:programfiles}" + "\$Product\"
$UnattendedArgs = "/i $PackageName.$InstallerType ALLUSERS=1 /qn /liewa $LogApp"
Start-Transcript $LogPS
if ( -Not (Test-Path -Path "$Version-$arch" ) ) {
New-Item -ItemType directory -Path "$Version-$arch"
}
Set-Location "$Version-$arch"
Write-Verbose "Downloading $Vendor $Product $Version $arch" -Verbose
If (!(Test-Path -Path $Source)) {
Invoke-WebRequest -Uri $url -OutFile $Source -UseBasicParsing
}
Else {
Write-Verbose "File exists. Skipping Download." -Verbose
}
Write-Verbose "Starting Installation of $Vendor $Product $Version $arch" -Verbose
(Start-Process msiexec.exe -ArgumentList $UnattendedArgs -Wait -Passthru).ExitCode
Write-Verbose "Customization" -Verbose
Write-Verbose "Stop logging" -Verbose
$EndDTM = (Get-Date)
Write-Verbose "Elapsed Time: $(($EndDTM-$StartDTM).TotalSeconds) Seconds" -Verbose
Write-Verbose "Elapsed Time: $(($EndDTM-$StartDTM).TotalMinutes) Minutes" -Verbose
Stop-Transcript
If you do have any questions or comments about this, please put them below. Thank you.