Files
management-scripts/Fix-PreventWindows11Upgrade.ps1
2023-07-26 14:00:52 -04:00

52 lines
2.9 KiB
PowerShell

# NOTE: This script will only have an effect Windows 10 Professional and Enterprise versions
# Return a Powershell version object from a string
Function Get-Version {
param([Parameter(Mandatory=$true)][string]$Version)
[int]$Sets = 4
$VersionArray = $Version.Split('.')
If ( $VersionArray.Count -le $Sets ) { $Sets = $VersionArray.Count }
For ($i = 0; $i -le ($Sets - 1); $i++) {
$Return = '{0}.{1}' -f $Return, $VersionArray[$i] }
Return [version]$Return.Trim('.')
}
# Compare current Windows version with a supplied version
# The value supplied must be a string and must include at least 1 decimal
# Use this page to match build numbers and servicing release versions: https://docs.microsoft.com/en-us/windows/release-health/release-information
Function IsWindowsVersion {
param(
[Parameter(Mandatory=$true,ParameterSetName='gt')][string]$gt,
[Parameter(Mandatory=$true,ParameterSetName='ge')][string]$ge,
[Parameter(Mandatory=$true,ParameterSetName='lt')][string]$lt,
[Parameter(Mandatory=$true,ParameterSetName='le')][string]$le,
[Parameter(Mandatory=$true,ParameterSetName='eq')][string]$eq
)
[version]$WindowsVersion = [System.Environment]::OSVersion.Version
switch ($PSCmdlet.ParameterSetName) {
'gt' { If ( $WindowsVersion -gt (Get-Version $gt) ) { Return $true } Else { Return $false } }
'ge' { If ( $WindowsVersion -ge (Get-Version $ge) ) { Return $true } Else { Return $false } }
'lt' { If ( $WindowsVersion -lt (Get-Version $lt) ) { Return $true } Else { Return $false } }
'le' { If ( $WindowsVersion -le (Get-Version $le) ) { Return $true } Else { Return $false } }
'eq' { If ( $WindowsVersion -eq (Get-Version $eq) ) { Return $true } Else { Return $false } }
}
}
# Make sure we're running at least Windows 10 1803 but not higher than Windows 10 21H2
# This is because the Group Policy setting used below was introduced in 1803, so anything before that won't have any effect
If ( (IsWindowsVersion -ge "10.0.17134") -and (IsWindowsVersion -le "10.0.19045") ) {
# This is the version of Windows 10 you want to update to, but no further
$MaxWindowsVersion = "22H2"
$BaseRegPath = "HKLM:SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate"
If (-not (Test-Path $BaseRegPath) ) { New-Item -Path $BaseRegPath -Force | Out-Null }
New-ItemProperty -Path $BaseRegPath -Name "ProductVersion" -Value "Windows 10" -PropertyType String -Force | Out-Null
New-ItemProperty -Path $BaseRegPath -Name "TargetReleaseVersion" -Value 1 -PropertyType DWord -Force | Out-Null
New-ItemProperty -Path $BaseRegPath -Name "TargetReleaseVersionInfo" -Value "${MaxWindowsVersion}" -PropertyType String -Force | Out-Null
# Restart the Windows Update service if it's currently running
If ( $(Get-Service -Name wuauserv).Status -eq "Running" ) { Restart-Service -Name wuauserv -Force -ErrorAction SilentlyContinue }
}