mirror of
https://github.com/pbatard/Fido.git
synced 2025-09-17 14:48:02 +02:00
Compare commits
18 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
4b24ae5795 | ||
![]() |
2ca0f62f53 | ||
![]() |
448cfa72cf | ||
![]() |
9552df66d5 | ||
![]() |
4bafb688da | ||
![]() |
ad79094c30 | ||
![]() |
8cf4a279ff | ||
![]() |
84f833b067 | ||
![]() |
c34a41fe3f | ||
![]() |
6593585ff3 | ||
![]() |
fac4c49262 | ||
![]() |
f8aacf0703 | ||
![]() |
24a7a04d78 | ||
![]() |
eefc2453c4 | ||
![]() |
ed1a6b31a6 | ||
![]() |
9beb231b78 | ||
![]() |
ce7cb583e5 | ||
![]() |
0287fe274e |
3
.gitattributes
vendored
3
.gitattributes
vendored
@@ -1,3 +1,6 @@
|
|||||||
* text=auto
|
* text=auto
|
||||||
*.ps1 eol=crlf
|
*.ps1 eol=crlf
|
||||||
*.sh eol=lf
|
*.sh eol=lf
|
||||||
|
.gitattributes export-ignore
|
||||||
|
.gitignore export-ignore
|
||||||
|
sign.sh export-ignore
|
||||||
|
@@ -1,8 +0,0 @@
|
|||||||
{
|
|
||||||
"checkRunSettings": {
|
|
||||||
"vulnerableCheckRunConclusionLevel": "failure"
|
|
||||||
},
|
|
||||||
"issueSettings": {
|
|
||||||
"minSeverityLevel": "LOW"
|
|
||||||
}
|
|
||||||
}
|
|
197
Fido.ps1
197
Fido.ps1
@@ -1,6 +1,6 @@
|
|||||||
#
|
#
|
||||||
# Fido v1.30 - Feature ISO Downloader, for retail Windows images and UEFI Shell
|
# Fido v1.42 - Feature ISO Downloader, for retail Windows images and UEFI Shell
|
||||||
# Copyright © 2019-2022 Pete Batard <pete@akeo.ie>
|
# Copyright © 2019-2023 Pete Batard <pete@akeo.ie>
|
||||||
# Command line support: Copyright © 2021 flx5
|
# Command line support: Copyright © 2021 flx5
|
||||||
# ConvertTo-ImageSource: Copyright © 2016 Chris Carter
|
# ConvertTo-ImageSource: Copyright © 2016 Chris Carter
|
||||||
#
|
#
|
||||||
@@ -24,7 +24,7 @@
|
|||||||
#region Parameters
|
#region Parameters
|
||||||
param(
|
param(
|
||||||
# (Optional) The title to display on the application window.
|
# (Optional) The title to display on the application window.
|
||||||
[string]$AppTitle = "Fido - Retail Windows ISO Downloader",
|
[string]$AppTitle = "Fido - Feature ISO Downloader",
|
||||||
# (Optional) '|' separated UI localization strings.
|
# (Optional) '|' separated UI localization strings.
|
||||||
[string]$LocData,
|
[string]$LocData,
|
||||||
# (Optional) Path to a file that should be used for the UI icon.
|
# (Optional) Path to a file that should be used for the UI icon.
|
||||||
@@ -45,18 +45,12 @@ param(
|
|||||||
# (Optional) Only display the download URL [Toggles commandline mode]
|
# (Optional) Only display the download URL [Toggles commandline mode]
|
||||||
[switch]$GetUrl = $False,
|
[switch]$GetUrl = $False,
|
||||||
# (Optional) Increase verbosity
|
# (Optional) Increase verbosity
|
||||||
[switch]$Verbose = $False
|
[switch]$Verbose = $False,
|
||||||
|
# (Optional) Disable the progress bar
|
||||||
|
[switch]$DisableProgress = $False
|
||||||
)
|
)
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
# 2022-08-12: This script is currently not operational for Windows ISOs since Microsoft
|
|
||||||
# altered their website in a manner that is hostile to our queries.
|
|
||||||
# Please see https://github.com/pbatard/Fido/issues/41 for details.
|
|
||||||
# If you think you can help, set the following variable to $False and try your best! ;)
|
|
||||||
$Disable_Windows_ISOs = $True
|
|
||||||
$Disable_Windows_Msg = "Download of Windows ISOs is no longer available due to Microsoft having altered their website to prevent it. :(`r`n`r`n" `
|
|
||||||
+ "If you think you can help, please see:`r`nhttps://github.com/pbatard/Fido/issues/41"
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
|
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
|
||||||
} catch {}
|
} catch {}
|
||||||
@@ -66,6 +60,14 @@ if ($Win -or $Rel -or $Ed -or $Lang -or $Arch -or $GetUrl) {
|
|||||||
$Cmd = $True
|
$Cmd = $True
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Craft a decimal numeric version of Windows, since Windows 7's PowerShell is too stupid to compare it to a Version object
|
||||||
|
$winver = [System.Environment]::OSVersion.Version.Major * 1.0 + [System.Environment]::OSVersion.Version.Minor * 0.1
|
||||||
|
|
||||||
|
# The default TLS for Windows 8.x doesn't work with Microsoft's servers so we must force it
|
||||||
|
if ($winver -lt 10.0) {
|
||||||
|
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls -bor [Net.SecurityProtocolType]::Tls11 -bor [Net.SecurityProtocolType]::Tls12
|
||||||
|
}
|
||||||
|
|
||||||
#region Assembly Types
|
#region Assembly Types
|
||||||
$code = @"
|
$code = @"
|
||||||
[DllImport("shell32.dll", CharSet = CharSet.Auto, SetLastError = true, BestFitMapping = false, ThrowOnUnmappableChar = true)]
|
[DllImport("shell32.dll", CharSet = CharSet.Auto, SetLastError = true, BestFitMapping = false, ThrowOnUnmappableChar = true)]
|
||||||
@@ -88,11 +90,12 @@ $code = @"
|
|||||||
|
|
||||||
if (!$Cmd) {
|
if (!$Cmd) {
|
||||||
Write-Host Please Wait...
|
Write-Host Please Wait...
|
||||||
|
$Drawing_Assembly = "System.Drawing"
|
||||||
|
# PowerShell 7 altered the name of the Drawing assembly...
|
||||||
if ($host.version -ge "7.0") {
|
if ($host.version -ge "7.0") {
|
||||||
Add-Type -WarningAction Ignore -IgnoreWarnings -MemberDefinition $code -Namespace Gui -UsingNamespace System.Runtime, System.IO, System.Text, System.Drawing, System.Globalization -ReferencedAssemblies System.Drawing.Common -Name Utils -ErrorAction Stop
|
$Drawing_Assembly += ".Common"
|
||||||
} else {
|
|
||||||
Add-Type -MemberDefinition $code -Namespace Gui -UsingNamespace System.IO, System.Text, System.Drawing, System.Globalization -ReferencedAssemblies System.Drawing -Name Utils -ErrorAction Stop
|
|
||||||
}
|
}
|
||||||
|
Add-Type -ErrorAction Stop -WarningAction Ignore -IgnoreWarnings -MemberDefinition $code -Namespace Gui -UsingNamespace System.Runtime, System.IO, System.Text, System.Drawing, System.Globalization -ReferencedAssemblies $Drawing_Assembly -Name Utils
|
||||||
Add-Type -AssemblyName PresentationFramework
|
Add-Type -AssemblyName PresentationFramework
|
||||||
# Hide the powershell window: https://stackoverflow.com/a/27992426/1069307
|
# Hide the powershell window: https://stackoverflow.com/a/27992426/1069307
|
||||||
[Gui.Utils]::ShowWindow(([System.Diagnostics.Process]::GetCurrentProcess() | Get-Process).MainWindowHandle, 0) | Out-Null
|
[Gui.Utils]::ShowWindow(([System.Diagnostics.Process]::GetCurrentProcess() | Get-Process).MainWindowHandle, 0) | Out-Null
|
||||||
@@ -105,6 +108,11 @@ $ko = 0x20000
|
|||||||
$WindowsVersions = @(
|
$WindowsVersions = @(
|
||||||
@(
|
@(
|
||||||
@("Windows 11", "windows11"),
|
@("Windows 11", "windows11"),
|
||||||
|
@(
|
||||||
|
"22H2 v1 (Build 22621.525 - 2022.10)",
|
||||||
|
@("Windows 11 Home/Pro/Edu", 2370),
|
||||||
|
@("Windows 11 Home China ", ($zh + 2371))
|
||||||
|
),
|
||||||
@(
|
@(
|
||||||
"21H2 v1 (Build 22000.318 - 2021.11)",
|
"21H2 v1 (Build 22000.318 - 2021.11)",
|
||||||
@("Windows 11 Home/Pro/Edu", 2093),
|
@("Windows 11 Home/Pro/Edu", 2093),
|
||||||
@@ -118,6 +126,11 @@ $WindowsVersions = @(
|
|||||||
),
|
),
|
||||||
@(
|
@(
|
||||||
@("Windows 10", "Windows10ISO"),
|
@("Windows 10", "Windows10ISO"),
|
||||||
|
@(
|
||||||
|
"22H2 (Build 19045.2006 - 2022.10)",
|
||||||
|
@("Windows 10 Home/Pro/Edu", 2377),
|
||||||
|
@("Windows 10 Home China ", ($zh + 2378))
|
||||||
|
),
|
||||||
@(
|
@(
|
||||||
"21H2 (Build 19044.1288 - 2021.11)",
|
"21H2 (Build 19044.1288 - 2021.11)",
|
||||||
@("Windows 10 Home/Pro/Edu", 2084),
|
@("Windows 10 Home/Pro/Edu", 2084),
|
||||||
@@ -281,6 +294,11 @@ $WindowsVersions = @(
|
|||||||
),
|
),
|
||||||
@(
|
@(
|
||||||
@("UEFI Shell 2.2", "UEFI_SHELL 2.2"),
|
@("UEFI Shell 2.2", "UEFI_SHELL 2.2"),
|
||||||
|
@(
|
||||||
|
"22H2 (edk2-stable202211)",
|
||||||
|
@("Release", 0),
|
||||||
|
@("Debug", 1)
|
||||||
|
),
|
||||||
@(
|
@(
|
||||||
"22H1 (edk2-stable202205)",
|
"22H1 (edk2-stable202205)",
|
||||||
@("Release", 0),
|
@("Release", 0),
|
||||||
@@ -489,7 +507,7 @@ function ConvertTo-ImageSource
|
|||||||
|
|
||||||
function Throw-Error([object]$Req, [string]$Alt)
|
function Throw-Error([object]$Req, [string]$Alt)
|
||||||
{
|
{
|
||||||
$Err = $(GetElementById -Request $r -Id "errorModalMessage").innerText
|
$Err = $(GetElementById -Request $Req -Id "errorModalMessage").innerText -replace "<[^>]+>" -replace "\s+", " "
|
||||||
if (-not $Err) {
|
if (-not $Err) {
|
||||||
$Err = $Alt
|
$Err = $Alt
|
||||||
} else {
|
} else {
|
||||||
@@ -592,7 +610,7 @@ $RequestData["GetLangs"] = @("a8f8f489-4c7f-463a-9ca6-5cff94d8d041", "getskuinfo
|
|||||||
# This GUID applies to visitors of the en-US download page. Other locales may get a different GUID.
|
# This GUID applies to visitors of the en-US download page. Other locales may get a different GUID.
|
||||||
$RequestData["GetLinks"] = @("6e2a1789-ef16-4f27-a296-74ef7ef5d96b", "GetProductDownloadLinksBySku" )
|
$RequestData["GetLinks"] = @("6e2a1789-ef16-4f27-a296-74ef7ef5d96b", "GetProductDownloadLinksBySku" )
|
||||||
# Create a semi-random Linux User-Agent string
|
# Create a semi-random Linux User-Agent string
|
||||||
$FirefoxVersion = Get-Random -Minimum 50 -Maximum 90
|
$FirefoxVersion = Get-Random -Minimum 90 -Maximum 110
|
||||||
$FirefoxDate = Get-RandomDate
|
$FirefoxDate = Get-RandomDate
|
||||||
$UserAgent = "Mozilla/5.0 (X11; Linux i586; rv:$FirefoxVersion.0) Gecko/$FirefoxDate Firefox/$FirefoxVersion.0"
|
$UserAgent = "Mozilla/5.0 (X11; Linux i586; rv:$FirefoxVersion.0) Gecko/$FirefoxDate Firefox/$FirefoxVersion.0"
|
||||||
$Verbosity = 2
|
$Verbosity = 2
|
||||||
@@ -607,30 +625,25 @@ if ($Cmd) {
|
|||||||
|
|
||||||
# Localization
|
# Localization
|
||||||
$EnglishMessages = "en-US|Version|Release|Edition|Language|Architecture|Download|Continue|Back|Close|Cancel|Error|Please wait...|" +
|
$EnglishMessages = "en-US|Version|Release|Edition|Language|Architecture|Download|Continue|Back|Close|Cancel|Error|Please wait...|" +
|
||||||
"Download using a browser|Temporarily banned by Microsoft for requesting too many downloads - Please try again later...|" +
|
"Download using a browser|Download of Windows ISOs is unavailable due to Microsoft having altered their website to prevent it.|" +
|
||||||
"PowerShell 3.0 or later is required to run this script.|Do you want to go online and download it?"
|
"PowerShell 3.0 or later is required to run this script.|Do you want to go online and download it?|" +
|
||||||
|
"This feature is not available for this version of Windows."
|
||||||
[string[]]$English = $EnglishMessages.Split('|')
|
[string[]]$English = $EnglishMessages.Split('|')
|
||||||
[string[]]$Localized = $null
|
[string[]]$Localized = $null
|
||||||
if ($LocData -and (-not $LocData.StartsWith("en-US"))) {
|
if ($LocData -and (-not $LocData.StartsWith("en-US"))) {
|
||||||
$Localized = $LocData.Split('|')
|
$Localized = $LocData.Split('|')
|
||||||
if ($Localized.Length -ne $English.Length) {
|
# Adjust the $Localized array if we have more or fewer strings than in $EnglishMessages
|
||||||
Write-Host "Error: Missing or extra translated messages provided ($($Localized.Length)/$($English.Length))"
|
if ($Localized.Length -lt $English.Length) {
|
||||||
exit 101
|
while ($Localized.Length -ne $English.Length) {
|
||||||
|
$Localized += $English[$Localized.Length]
|
||||||
|
}
|
||||||
|
} elseif ($Localized.Length -gt $English.Length) {
|
||||||
|
$Localized = $LocData.Split('|')[0..($English.Length - 1)]
|
||||||
}
|
}
|
||||||
$Locale = $Localized[0]
|
$Locale = $Localized[0]
|
||||||
}
|
}
|
||||||
$QueryLocale = $Locale
|
$QueryLocale = $Locale
|
||||||
|
|
||||||
# Make sure PowerShell 3.0 or later is used (for Invoke-WebRequest)
|
|
||||||
if ($PSVersionTable.PSVersion.Major -lt 3) {
|
|
||||||
Write-Host Error: PowerShell 3.0 or later is required to run this script.
|
|
||||||
$Msg = "$(Get-Translation($English[15]))`n$(Get-Translation($English[16]))"
|
|
||||||
if ([System.Windows.MessageBox]::Show($Msg, $(Get-Translation("Error")), "YesNo", "Error") -eq "Yes") {
|
|
||||||
Start-Process -FilePath https://www.microsoft.com/download/details.aspx?id=34595
|
|
||||||
}
|
|
||||||
exit 102
|
|
||||||
}
|
|
||||||
|
|
||||||
# Convert a size in bytes to a human readable string
|
# Convert a size in bytes to a human readable string
|
||||||
function Size-To-Human-Readable([uint64]$size)
|
function Size-To-Human-Readable([uint64]$size)
|
||||||
{
|
{
|
||||||
@@ -700,6 +713,17 @@ function Get-Windows-Languages([int]$SelectedVersion, [int]$SelectedEdition)
|
|||||||
} elseif ($WindowsVersions[$SelectedVersion][0][1].StartsWith("UEFI_SHELL")) {
|
} elseif ($WindowsVersions[$SelectedVersion][0][1].StartsWith("UEFI_SHELL")) {
|
||||||
$languages += @(New-Object PsObject -Property @{ DisplayLanguage = "English (US)"; Language = "en-us"; Id = 0 })
|
$languages += @(New-Object PsObject -Property @{ DisplayLanguage = "English (US)"; Language = "en-us"; Id = 0 })
|
||||||
} else {
|
} else {
|
||||||
|
# Microsoft download protection now requires the sessionId to be whitelisted through vlscppe.microsoft.com/tags
|
||||||
|
$url = "https://vlscppe.microsoft.com/tags?org_id=y6jn8c31&session_id=" + $SessionId
|
||||||
|
if ($Verbosity -ge 2) {
|
||||||
|
Write-Host Querying $url
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
Invoke-WebRequest -UseBasicParsing -MaximumRedirection 0 -UserAgent $UserAgent $url | Out-Null
|
||||||
|
} catch {
|
||||||
|
Error($_.Exception.Message)
|
||||||
|
return @()
|
||||||
|
}
|
||||||
$url = "https://www.microsoft.com/" + $QueryLocale + "/api/controls/contentinclude/html"
|
$url = "https://www.microsoft.com/" + $QueryLocale + "/api/controls/contentinclude/html"
|
||||||
$url += "?pageId=" + $RequestData["GetLangs"][0]
|
$url += "?pageId=" + $RequestData["GetLangs"][0]
|
||||||
$url += "&host=www.microsoft.com"
|
$url += "&host=www.microsoft.com"
|
||||||
@@ -714,11 +738,12 @@ function Get-Windows-Languages([int]$SelectedVersion, [int]$SelectedEdition)
|
|||||||
|
|
||||||
$script:SelectedIndex = 0
|
$script:SelectedIndex = 0
|
||||||
try {
|
try {
|
||||||
$r = Invoke-WebRequest -UseBasicParsing -UserAgent $UserAgent -SessionVariable "Session" $url
|
$r = Invoke-WebRequest -Method Post -UseBasicParsing -UserAgent $UserAgent -SessionVariable "Session" $url
|
||||||
if ($r -match "errorModalMessage") {
|
if ($r -match "errorModalMessage") {
|
||||||
Throw-Error -Req $r -Alt "Could not retrieve languages from server"
|
Throw-Error -Req $r -Alt "Could not retrieve languages from server"
|
||||||
}
|
}
|
||||||
$pattern = '(?s)<select id="product-languages">(.*)?</select>'
|
$r = $r -replace "`n" -replace "`r"
|
||||||
|
$pattern = '.*<select id="product-languages"[^>]*>(.*)</select>.*'
|
||||||
$html = [regex]::Match($r, $pattern).Groups[1].Value
|
$html = [regex]::Match($r, $pattern).Groups[1].Value
|
||||||
# Go through an XML conversion to keep all PowerShells happy...
|
# Go through an XML conversion to keep all PowerShells happy...
|
||||||
$html = $html.Replace("selected value", "value")
|
$html = $html.Replace("selected value", "value")
|
||||||
@@ -801,10 +826,19 @@ function Get-Windows-Download-Links([int]$SelectedVersion, [int]$SelectedRelease
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
$Is64 = [Environment]::Is64BitOperatingSystem
|
$Is64 = [Environment]::Is64BitOperatingSystem
|
||||||
$r = Invoke-WebRequest -Method Post -UseBasicParsing -UserAgent $UserAgent -WebSession $Session $url
|
# Must add a referer for this request, else Microsoft's servers will deny it
|
||||||
# Write-Host $r
|
$ref = "https://www.microsoft.com/software-download/windows11"
|
||||||
|
$r = Invoke-WebRequest -Method Post -Headers @{ "Referer" = $ref } -UseBasicParsing -UserAgent $UserAgent -WebSession $Session $url
|
||||||
if ($r -match "errorModalMessage") {
|
if ($r -match "errorModalMessage") {
|
||||||
Throw-Error -Req $r -Alt "Could not retrieve architectures from server"
|
$regex = New-Object Text.RegularExpressions.Regex '<p id="errorModalMessage">(.+?)<\/p>'
|
||||||
|
$m = $regex.Match($r)
|
||||||
|
# Make the typical error message returned by Microsoft's servers more presentable
|
||||||
|
$Alt = $m.Groups[1] -replace "<[^>]+>" -replace "\s+", " "
|
||||||
|
$Alt += " " + $SessionId + "."
|
||||||
|
if (-not $Alt) {
|
||||||
|
$Alt = "Could not retrieve architectures from server"
|
||||||
|
}
|
||||||
|
Throw-Error -Req $r -Alt $Alt
|
||||||
}
|
}
|
||||||
$pattern = '(?s)(<input.*?></input>)'
|
$pattern = '(?s)(<input.*?></input>)'
|
||||||
ForEach-Object { [regex]::Matches($r, $pattern) } | ForEach-Object { $html += $_.Groups[1].value }
|
ForEach-Object { [regex]::Matches($r, $pattern) } | ForEach-Object { $html += $_.Groups[1].value }
|
||||||
@@ -852,6 +886,9 @@ function Process-Download-Link([string]$Url)
|
|||||||
$tmp_size = [uint64]::Parse($str_size)
|
$tmp_size = [uint64]::Parse($str_size)
|
||||||
$Size = Size-To-Human-Readable $tmp_size
|
$Size = Size-To-Human-Readable $tmp_size
|
||||||
Write-Host "Downloading '$File' ($Size)..."
|
Write-Host "Downloading '$File' ($Size)..."
|
||||||
|
if ($DisableProgress) {
|
||||||
|
$ProgressPreference = 'SilentlyContinue'
|
||||||
|
}
|
||||||
Invoke-WebRequest -UseBasicParsing -Uri $Url -OutFile $File
|
Invoke-WebRequest -UseBasicParsing -Uri $Url -OutFile $File
|
||||||
} else {
|
} else {
|
||||||
Write-Host Download Link: $Url
|
Write-Host Download Link: $Url
|
||||||
@@ -873,6 +910,12 @@ if ($Cmd) {
|
|||||||
$winLanguageName = $null
|
$winLanguageName = $null
|
||||||
$winLink = $null
|
$winLink = $null
|
||||||
|
|
||||||
|
# Windows 7 has become too much of a liability
|
||||||
|
if ($winver -le 6.1) {
|
||||||
|
Error(Get-Translation("This feature is not available for this version of Windows."))
|
||||||
|
exit 403
|
||||||
|
}
|
||||||
|
|
||||||
$i = 0
|
$i = 0
|
||||||
$Selected = ""
|
$Selected = ""
|
||||||
if ($Win -eq "List") {
|
if ($Win -eq "List") {
|
||||||
@@ -896,11 +939,6 @@ if ($Cmd) {
|
|||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($Disable_Windows_ISOs -and $winVersionId -lt 3) {
|
|
||||||
Write-Host $Disable_Windows_Msg
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
# Windows Version selection
|
# Windows Version selection
|
||||||
$releases = Get-Windows-Releases $winVersionId
|
$releases = Get-Windows-Releases $winVersionId
|
||||||
if ($Rel -eq "List") {
|
if ($Rel -eq "List") {
|
||||||
@@ -938,7 +976,7 @@ if ($Cmd) {
|
|||||||
if (!$Ed -and $Verbosity -ge 1) {
|
if (!$Ed -and $Verbosity -ge 1) {
|
||||||
Write-Host "No edition specified (-Ed). Defaulting to '$($edition.Edition)'."
|
Write-Host "No edition specified (-Ed). Defaulting to '$($edition.Edition)'."
|
||||||
}
|
}
|
||||||
$Selected += "," + $edition.Edition -replace "Windows [0-9\.]*", ""
|
$Selected += "," + $edition.Edition -replace "Windows [0-9\.]*"
|
||||||
$winEditionId = $edition.Id
|
$winEditionId = $edition.Id
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -958,6 +996,10 @@ if ($Cmd) {
|
|||||||
}
|
}
|
||||||
if ($Lang -eq "List") {
|
if ($Lang -eq "List") {
|
||||||
Write-Host "Please select a Language (-Lang) for ${Selected}:"
|
Write-Host "Please select a Language (-Lang) for ${Selected}:"
|
||||||
|
} elseif ($Lang) {
|
||||||
|
# Escape parentheses so that they aren't interpreted as regex
|
||||||
|
$Lang = $Lang.replace('(', '\(')
|
||||||
|
$Lang = $Lang.replace(')', '\)')
|
||||||
}
|
}
|
||||||
$i = 0
|
$i = 0
|
||||||
foreach ($language in $languages) {
|
foreach ($language in $languages) {
|
||||||
@@ -974,7 +1016,7 @@ if ($Cmd) {
|
|||||||
}
|
}
|
||||||
$i++
|
$i++
|
||||||
}
|
}
|
||||||
if ($winLanguageId -eq $null -or $winLanguageName -eq $null) {
|
if (!$winLanguageId -or !$winLanguageName) {
|
||||||
if ($Lang -ne "List") {
|
if ($Lang -ne "List") {
|
||||||
Write-Host "Invalid Windows language provided."
|
Write-Host "Invalid Windows language provided."
|
||||||
Write-Host "Use '-Lang List' for a list of available languages or remove the option to use system default."
|
Write-Host "Use '-Lang List' for a list of available languages or remove the option to use system default."
|
||||||
@@ -1032,7 +1074,7 @@ $XMLForm.Title = $AppTitle
|
|||||||
if ($Icon) {
|
if ($Icon) {
|
||||||
$XMLForm.Icon = $Icon
|
$XMLForm.Icon = $Icon
|
||||||
} else {
|
} else {
|
||||||
$XMLForm.Icon = [Gui.Utils]::ExtractIcon("shell32.dll", -41, $true) | ConvertTo-ImageSource
|
$XMLForm.Icon = [Gui.Utils]::ExtractIcon("imageres.dll", -5205, $true) | ConvertTo-ImageSource
|
||||||
}
|
}
|
||||||
if ($Locale.StartsWith("ar") -or $Locale.StartsWith("fa") -or $Locale.StartsWith("he")) {
|
if ($Locale.StartsWith("ar") -or $Locale.StartsWith("fa") -or $Locale.StartsWith("he")) {
|
||||||
$XMLForm.FlowDirection = "RightToLeft"
|
$XMLForm.FlowDirection = "RightToLeft"
|
||||||
@@ -1041,6 +1083,12 @@ $WindowsVersionTitle.Text = Get-Translation("Version")
|
|||||||
$Continue.Content = Get-Translation("Continue")
|
$Continue.Content = Get-Translation("Continue")
|
||||||
$Back.Content = Get-Translation("Close")
|
$Back.Content = Get-Translation("Close")
|
||||||
|
|
||||||
|
# Windows 7 has become too much of a liability
|
||||||
|
if ($winver -le 6.1) {
|
||||||
|
Error(Get-Translation("This feature is not available for this version of Windows."))
|
||||||
|
exit 403
|
||||||
|
}
|
||||||
|
|
||||||
# Populate the Windows versions
|
# Populate the Windows versions
|
||||||
$i = 0
|
$i = 0
|
||||||
$versions = @()
|
$versions = @()
|
||||||
@@ -1066,14 +1114,7 @@ $Continue.add_click({
|
|||||||
$XMLForm.Title = Get-Translation($English[12])
|
$XMLForm.Title = Get-Translation($English[12])
|
||||||
Refresh-Control($XMLForm)
|
Refresh-Control($XMLForm)
|
||||||
if ($WindowsVersion.SelectedValue.Version.StartsWith("Windows") -and $WindowsVersion.SelectedValue.Version -ne "Windows 7") {
|
if ($WindowsVersion.SelectedValue.Version.StartsWith("Windows") -and $WindowsVersion.SelectedValue.Version -ne "Windows 7") {
|
||||||
if ($Disable_Windows_ISOs) {
|
Check-Locale
|
||||||
Error($Disable_Windows_Msg)
|
|
||||||
$script:ExitCode = 1
|
|
||||||
$XMLForm.Close()
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
Check-Locale
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
$releases = Get-Windows-Releases $WindowsVersion.SelectedValue.Index
|
$releases = Get-Windows-Releases $WindowsVersion.SelectedValue.Index
|
||||||
$script:WindowsRelease = Add-Entry $Stage "Release" $releases
|
$script:WindowsRelease = Add-Entry $Stage "Release" $releases
|
||||||
@@ -1177,8 +1218,8 @@ exit $ExitCode
|
|||||||
# SIG # Begin signature block
|
# SIG # Begin signature block
|
||||||
# MIIkWAYJKoZIhvcNAQcCoIIkSTCCJEUCAQExDzANBglghkgBZQMEAgEFADB5Bgor
|
# MIIkWAYJKoZIhvcNAQcCoIIkSTCCJEUCAQExDzANBglghkgBZQMEAgEFADB5Bgor
|
||||||
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
|
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
|
||||||
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCBIbXdlyM4YkMuO
|
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCDa8PrIe1NSjXqW
|
||||||
# 1TiheNA9UI6/439UbwfpoVydyjKG6qCCElkwggVvMIIEV6ADAgECAhBI/JO0YFWU
|
# rwtj7a1ha0/FMIwXSDFruNwgp2G8haCCElkwggVvMIIEV6ADAgECAhBI/JO0YFWU
|
||||||
# jTanyYqJ1pQWMA0GCSqGSIb3DQEBDAUAMHsxCzAJBgNVBAYTAkdCMRswGQYDVQQI
|
# jTanyYqJ1pQWMA0GCSqGSIb3DQEBDAUAMHsxCzAJBgNVBAYTAkdCMRswGQYDVQQI
|
||||||
# DBJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoM
|
# DBJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoM
|
||||||
# EUNvbW9kbyBDQSBMaW1pdGVkMSEwHwYDVQQDDBhBQUEgQ2VydGlmaWNhdGUgU2Vy
|
# EUNvbW9kbyBDQSBMaW1pdGVkMSEwHwYDVQQDDBhBQUEgQ2VydGlmaWNhdGUgU2Vy
|
||||||
@@ -1281,22 +1322,22 @@ exit $ExitCode
|
|||||||
# aWMgQ29kZSBTaWduaW5nIENBIEVWIFIzNgIRAL+xUAG79ZLUlip3l+pzb6MwDQYJ
|
# aWMgQ29kZSBTaWduaW5nIENBIEVWIFIzNgIRAL+xUAG79ZLUlip3l+pzb6MwDQYJ
|
||||||
# YIZIAWUDBAIBBQCgfDAQBgorBgEEAYI3AgEMMQIwADAZBgkqhkiG9w0BCQMxDAYK
|
# YIZIAWUDBAIBBQCgfDAQBgorBgEEAYI3AgEMMQIwADAZBgkqhkiG9w0BCQMxDAYK
|
||||||
# KwYBBAGCNwIBBDAcBgorBgEEAYI3AgELMQ4wDAYKKwYBBAGCNwIBFTAvBgkqhkiG
|
# KwYBBAGCNwIBBDAcBgorBgEEAYI3AgELMQ4wDAYKKwYBBAGCNwIBFTAvBgkqhkiG
|
||||||
# 9w0BCQQxIgQguJWcBhhTXKqrgsvi+2Ej/MyEHAwuocYCOMIyjaWspmkwDQYJKoZI
|
# 9w0BCQQxIgQgZt1L7FY2zlXGm+elfLNq4whr0tPpkCErcZFwHcLK42kwDQYJKoZI
|
||||||
# hvcNAQEBBQAEggIAn5afVKipUOYO2SSmLNI6VJe0LWsVIgo6Pq3WjXiPUTSvYEuE
|
# hvcNAQEBBQAEggIAO7AqJKab0cMvAjNl+zVgKFQ9/8RSM1+6u9cJGz3boyIc8XHK
|
||||||
# IXX9nYo00MfJUOWKsqbX4/VcSsoyhWtwMiJsWp5MNK/U243LivyLeyEYGjrheB+o
|
# YnKrhVIelU4+iwcD+KIHfZK9R5p30PhKB34QpxarEQ1g7VBc+BMKwaFPcke/gPr6
|
||||||
# 8Cdu2nyU5n91cpVtUIlz8Rpdanj6mnjkFzekumuCqEyiPuIUSjMrq3m8nd6+3Jyl
|
# hgIJZbvUogqVA9/evJjX1ulwyh5CSUosIYZUyXdV7t75PlbQ04ndzXtd1LUjPKp+
|
||||||
# P/waSI1TEQqBiGa/N1xrdR0Oji0VKwhUuotCbjS0vwS1ielKrf70+7dDaU0BtoaD
|
# EGSOzObzpTzfrKKAH0T9IFafp5wV+w3Nt1KhT8UmpLEGuh0QURLp4YhYy/KmWo+2
|
||||||
# sQph3SIlnjWxBJnOtRSvdCsuVnFMGpuHzkKVzdbFH81NIOLNTkRJqvPfE/h/s0mI
|
# wHeZsro7r1vS9J7099kD8+p1KnlgY63t2M3fY+5X7fPZ8jwGbFeEh0WyyzhNlqUd
|
||||||
# 4J50zpC16cqo2C1YdffhCuoKuaGau14zb7krjIP2+C/JXKWNcgHB3FhRrT8ZdAz7
|
# Ut8F931EnwnXXA+Re1FRNFd00JjdpmFQpqkQHY5HKh6FAbAxBmOGM5Zv3mpmkVjS
|
||||||
# qjJRpLqVr42dFsskGzhUli/nKVBZGxnNZa5L3U8n1k3Kgzj3iPE/B4R4UxGxAjYp
|
# 9VVoX3RaQMoXGduYIF8RnfKN6DV8OKc0V1D9NOPJcK/XZur6vow5Htpikj2Dyrdm
|
||||||
# tZMPWrvyBW9RXAhO0QqL6nPHeifXcUt184Isis2gIZ0akxeEgl9muADVxk8gpEvm
|
# kvMiK+sqkDGsqhIdiAYHfa8Pq2bMfB/AQs4kcF3gkBaRwZQSLr9blWF6H5mL01Qq
|
||||||
# 1ZuRkmLhPPK0VjqUDhswpPZKQTYWNkFyikeWclJo493D6TUF4PS/yldauhPz2CNA
|
# YwCE3umpacP/P48PEDQ2kL4QYTvkIY8YL6Y81TXGfOxBj/EwQNalyaytln5+I7/0
|
||||||
# AtTSAD7Vjay1MFTPdsq0Q5uOF09YJw1sm1vdMDz0mtUG3+5HQWY3HAAYd9+jGAw1
|
# nn1/nfriVU91cFvf1CYaId4xWqCTboC/49KtSN1cUMZsHFZggoPk5wNJZ/UIEAd3
|
||||||
# w2HQMTkzf5YWBMIUI7MFrOHbgYJ1hr5T7onR10hDeyfP6IwTwnk34xJKg2ehgg48
|
# 2K7NiWxbUQA3wDiNrymEgts3lg3zV5DWGgYosWottpzYfWBcZqiI/65JT42hgg48
|
||||||
# MIIOOAYKKwYBBAGCNwMDATGCDigwgg4kBgkqhkiG9w0BBwKggg4VMIIOEQIBAzEN
|
# MIIOOAYKKwYBBAGCNwMDATGCDigwgg4kBgkqhkiG9w0BBwKggg4VMIIOEQIBAzEN
|
||||||
# MAsGCWCGSAFlAwQCATCCAQ4GCyqGSIb3DQEJEAEEoIH+BIH7MIH4AgEBBgtghkgB
|
# MAsGCWCGSAFlAwQCATCCAQ4GCyqGSIb3DQEJEAEEoIH+BIH7MIH4AgEBBgtghkgB
|
||||||
# hvhFAQcXAzAxMA0GCWCGSAFlAwQCAQUABCCHsu/kPJA6jCWY6SR0cf9/bIvu1Raq
|
# hvhFAQcXAzAxMA0GCWCGSAFlAwQCAQUABCBgeYfVPt15f69ZGlb0XMap8ogxbbm0
|
||||||
# a/ro2lHM75R5uwIUWhRNqizOEmPWsWhFjbgAj0WOUfEYDzIwMjIwODEyMTI1MzU1
|
# dx/FX6105nFxYQIUUU2TzURLgm2l56wAV0nbgxAYczMYDzIwMjMwMTI3MTUxMTUy
|
||||||
# WjADAgEeoIGGpIGDMIGAMQswCQYDVQQGEwJVUzEdMBsGA1UEChMUU3ltYW50ZWMg
|
# WjADAgEeoIGGpIGDMIGAMQswCQYDVQQGEwJVUzEdMBsGA1UEChMUU3ltYW50ZWMg
|
||||||
# Q29ycG9yYXRpb24xHzAdBgNVBAsTFlN5bWFudGVjIFRydXN0IE5ldHdvcmsxMTAv
|
# Q29ycG9yYXRpb24xHzAdBgNVBAsTFlN5bWFudGVjIFRydXN0IE5ldHdvcmsxMTAv
|
||||||
# BgNVBAMTKFN5bWFudGVjIFNIQTI1NiBUaW1lU3RhbXBpbmcgU2lnbmVyIC0gRzOg
|
# BgNVBAMTKFN5bWFudGVjIFNIQTI1NiBUaW1lU3RhbXBpbmcgU2lnbmVyIC0gRzOg
|
||||||
@@ -1360,13 +1401,13 @@ exit $ExitCode
|
|||||||
# A1UEChMUU3ltYW50ZWMgQ29ycG9yYXRpb24xHzAdBgNVBAsTFlN5bWFudGVjIFRy
|
# A1UEChMUU3ltYW50ZWMgQ29ycG9yYXRpb24xHzAdBgNVBAsTFlN5bWFudGVjIFRy
|
||||||
# dXN0IE5ldHdvcmsxKDAmBgNVBAMTH1N5bWFudGVjIFNIQTI1NiBUaW1lU3RhbXBp
|
# dXN0IE5ldHdvcmsxKDAmBgNVBAMTH1N5bWFudGVjIFNIQTI1NiBUaW1lU3RhbXBp
|
||||||
# bmcgQ0ECEHvU5a+6zAc/oQEjBCJBTRIwCwYJYIZIAWUDBAIBoIGkMBoGCSqGSIb3
|
# bmcgQ0ECEHvU5a+6zAc/oQEjBCJBTRIwCwYJYIZIAWUDBAIBoIGkMBoGCSqGSIb3
|
||||||
# DQEJAzENBgsqhkiG9w0BCRABBDAcBgkqhkiG9w0BCQUxDxcNMjIwODEyMTI1MzU1
|
# DQEJAzENBgsqhkiG9w0BCRABBDAcBgkqhkiG9w0BCQUxDxcNMjMwMTI3MTUxMTUy
|
||||||
# WjAvBgkqhkiG9w0BCQQxIgQgmzPI3dPmxkbxDPwMgM+VdkDAogPDPZmNxy7JOZnY
|
# WjAvBgkqhkiG9w0BCQQxIgQgeeqIeo9Kcp71ZTFGCM4j8vvANl2gqXHGZO7PVGZz
|
||||||
# EVIwNwYLKoZIhvcNAQkQAi8xKDAmMCQwIgQgxHTOdgB9AjlODaXk3nwUxoD54oIB
|
# 1ygwNwYLKoZIhvcNAQkQAi8xKDAmMCQwIgQgxHTOdgB9AjlODaXk3nwUxoD54oIB
|
||||||
# PP72U+9dtx/fYfgwCwYJKoZIhvcNAQEBBIIBAIaXBlnLrDyXs8oAxEeCiV2Hg1Rd
|
# PP72U+9dtx/fYfgwCwYJKoZIhvcNAQEBBIIBAAx1R1UnC8znHFbV2JkK+/UklEJH
|
||||||
# 8id7aHZ3RiD00JydnXWlGs5Rrn+FPDSl8U3g+U4BUt6I6BN8LnQ/94hSAiMwaGCq
|
# 2vkucu8cyPp6TS84T5Zpf9+TYV1JLYy00bmkXFdsY4ioS+GRd+ocGpgv887bQXKw
|
||||||
# xJAb7gkFhyEYCUWjWypWQFO9A8yGa59m+MQvhingC+Ikdx5IEAYClzaGd4pd/J3B
|
# 7xEP4ouQ2MR2/o4wakDTy4GqzxL2awZSSJvaHLKk1H5+gkvkNcYV/vTkHgkpcUwC
|
||||||
# IMCrnjp8OYbfy1CeZa+K7TYQZiFRghwIYvNSFxL5/5jOu0m8qDCyDvsiSelid70m
|
# Qqfh4P5unQwnCsQwOVtzgjSbrmslS5ctac66Vvjs6/0ewnTYQncnA04Us5tR/UPH
|
||||||
# F6fTrpXG524iNCihpg+0J0zLUkguR5ug75ra4CTJMwhjuDQyJkcaW4BtrR9xLkNb
|
# bWSajMeLGp4E1k/sWWU9V7+uiQqx1wo5Qs6AjXkEu0NpfFGgUM1Js7X4cRUpWumM
|
||||||
# 6eynKUz24MTW+A9Q32gYjBHiM0uf/fDzWaX8tcVSr712MAMKt7haMJcRNmg=
|
# /q23yClpxUHiDHPA1nhOHLuHlgn8RZwEdTB6ZOD0JIRVp3RpZ9Q+Qlu34qc=
|
||||||
# SIG # End signature block
|
# SIG # End signature block
|
||||||
|
35
Fido.pssproj
35
Fido.pssproj
@@ -1,35 +0,0 @@
|
|||||||
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<PropertyGroup>
|
|
||||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
|
||||||
<SchemaVersion>2.0</SchemaVersion>
|
|
||||||
<ProjectGuid>6CAFC0C6-A428-4d30-A9F9-700E829FEA51</ProjectGuid>
|
|
||||||
<OutputType>Exe</OutputType>
|
|
||||||
<RootNamespace>Fido</RootNamespace>
|
|
||||||
<AssemblyName>Fido</AssemblyName>
|
|
||||||
<Name>Frida</Name>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
|
||||||
<DebugSymbols>true</DebugSymbols>
|
|
||||||
<DebugType>full</DebugType>
|
|
||||||
<Optimize>false</Optimize>
|
|
||||||
<OutputPath>bin\Debug\</OutputPath>
|
|
||||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
|
||||||
<ErrorReport>prompt</ErrorReport>
|
|
||||||
<WarningLevel>4</WarningLevel>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
|
||||||
<DebugType>pdbonly</DebugType>
|
|
||||||
<Optimize>true</Optimize>
|
|
||||||
<OutputPath>bin\Release\</OutputPath>
|
|
||||||
<DefineConstants>TRACE</DefineConstants>
|
|
||||||
<ErrorReport>prompt</ErrorReport>
|
|
||||||
<WarningLevel>4</WarningLevel>
|
|
||||||
</PropertyGroup>
|
|
||||||
<ItemGroup />
|
|
||||||
<ItemGroup>
|
|
||||||
<Compile Include="Fido.ps1" />
|
|
||||||
</ItemGroup>
|
|
||||||
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
|
|
||||||
<Target Name="Build" />
|
|
||||||
<Import Project="$(MSBuildExtensionsPath)\PowerShell Tools for Visual Studio\PowerShellTools.targets" Condition="Exists('$(MSBuildExtensionsPath)\PowerShell Tools for Visual Studio\PowerShellTools.targets')" />
|
|
||||||
</Project>
|
|
25
Fido.sln
25
Fido.sln
@@ -1,25 +0,0 @@
|
|||||||
|
|
||||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
|
||||||
# Visual Studio 15
|
|
||||||
VisualStudioVersion = 15.0.28307.271
|
|
||||||
MinimumVisualStudioVersion = 10.0.40219.1
|
|
||||||
Project("{F5034706-568F-408A-B7B3-4D38C6DB8A32}") = "Fido", "Fido.pssproj", "{6CAFC0C6-A428-4D30-A9F9-700E829FEA51}"
|
|
||||||
EndProject
|
|
||||||
Global
|
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
|
||||||
Debug|Any CPU = Debug|Any CPU
|
|
||||||
Release|Any CPU = Release|Any CPU
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
|
||||||
{6CAFC0C6-A428-4D30-A9F9-700E829FEA51}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{6CAFC0C6-A428-4D30-A9F9-700E829FEA51}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{6CAFC0C6-A428-4D30-A9F9-700E829FEA51}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{6CAFC0C6-A428-4D30-A9F9-700E829FEA51}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
|
||||||
HideSolutionNode = FALSE
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
|
||||||
SolutionGuid = {AD54CEAE-0992-4213-BEDB-8F1CF98A9F22}
|
|
||||||
EndGlobalSection
|
|
||||||
EndGlobal
|
|
25
README.md
25
README.md
@@ -1,5 +1,5 @@
|
|||||||
Fido: A PowerShell download script for Windows ISOs and UEFI Shell
|
Fido: A PowerShell download script for Microsoft Windows and UEFI Shell ISOs
|
||||||
==================================================================
|
============================================================================
|
||||||
|
|
||||||
[](https://www.gnu.org/licenses/gpl-3.0.en.html)
|
[](https://www.gnu.org/licenses/gpl-3.0.en.html)
|
||||||
[](https://github.com/pbatard/Fido/releases)
|
[](https://github.com/pbatard/Fido/releases)
|
||||||
@@ -9,12 +9,12 @@ Description
|
|||||||
|
|
||||||
Fido is a PowerShell script that is primarily designed to be used in [Rufus](https://github.com/pbatard/rufus), but that
|
Fido is a PowerShell script that is primarily designed to be used in [Rufus](https://github.com/pbatard/rufus), but that
|
||||||
can also be used in standalone fashion, and whose purpose is to automate access to the official Microsoft Windows retail
|
can also be used in standalone fashion, and whose purpose is to automate access to the official Microsoft Windows retail
|
||||||
ISO download links as well as provide convenient access to bootable UEFI Shell images.
|
ISO download links as well as provide convenient access to [bootable UEFI Shell images](https://github.com/pbatard/UEFI-Shell).
|
||||||
|
|
||||||
This script exists because, while Microsoft does make retail ISO download links freely and publicly available (at least
|
This script exists because, while Microsoft does make retail ISO download links freely and publicly available (at least
|
||||||
for Windows 8 and Windows 10), it only does so after actively forcing users to jump through a lot of unwarranted hoops,
|
for Windows 8 through Windows 11), up until recent releases, most of these links were only available after forcing users
|
||||||
that create an exceedingly counterproductive, if not downright unfriendly, consumer experience and that greatly detract
|
to jump through a lot of unwarranted hoops that created an exceedingly counterproductive, if not downright unfriendly,
|
||||||
from what people really want (direct access to ISO downloads).
|
consumer experience, that greatly detracted from what people really want (direct access to ISO downloads).
|
||||||
|
|
||||||
As to the reason one might want to download Windows __retail__ ISOs, as opposed to the ISOs that are generated by
|
As to the reason one might want to download Windows __retail__ ISOs, as opposed to the ISOs that are generated by
|
||||||
Microsoft's own Media Creation Tool (MCT), this is because using official retail ISOs is currently the only way to
|
Microsoft's own Media Creation Tool (MCT), this is because using official retail ISOs is currently the only way to
|
||||||
@@ -42,16 +42,16 @@ License
|
|||||||
How it works
|
How it works
|
||||||
------------
|
------------
|
||||||
|
|
||||||
The script basically performs the same operation as one might perform when visiting either of the following URLs (that
|
The script basically performs the same operation as one might perform when visiting the following URL (that is, in the
|
||||||
is, provided that you have also changed your `User-Agent` browser string, since, when they detect that you are using a
|
case of Windows 10, provided that you have also changed your `User-Agent` browser string, since, the Microsoft web
|
||||||
version of Windows that is the same as the one you are trying to download, the Microsoft web servers at these addresses
|
servers detect that you are using a version of Windows that is the same as the one you are trying to download, they
|
||||||
redirect you __away__ from the pages that allow you to download retail ISOs):
|
may redirect you __away__ from the page that allows you to obtain a direct ISO download link):
|
||||||
|
|
||||||
https://www.microsoft.com/en-us/software-download
|
https://www.microsoft.com/en-us/software-download
|
||||||
|
|
||||||
After checking access to these URLs, to confirm that they are accessible, the script first queries the web API from the
|
After checking basic access to the Microsoft software downloads website the script first queries the web API from the
|
||||||
Microsoft servers, to request the language selection available for the version of Windows selected, and then requests
|
Microsoft servers, to request the language selection available for the version of Windows selected, and then requests
|
||||||
the actual download links for all the architectures available for that language + version.
|
the actual download links, for all the architectures available for that language + version.
|
||||||
|
|
||||||
Requirements
|
Requirements
|
||||||
------------
|
------------
|
||||||
@@ -87,6 +87,7 @@ The options are:
|
|||||||
architecture as the one from the current system.
|
architecture as the one from the current system.
|
||||||
- `GetUrl`: By default, the script attempts to automatically launch the download. But when using the `-GetUrl` switch,
|
- `GetUrl`: By default, the script attempts to automatically launch the download. But when using the `-GetUrl` switch,
|
||||||
the script only displays the download URL, which can then be piped into another command or into a file.
|
the script only displays the download URL, which can then be piped into another command or into a file.
|
||||||
|
- `DisableProgress`: Disable progress report. This may speed up downloads when using the command line.
|
||||||
|
|
||||||
Examples of a commandline download:
|
Examples of a commandline download:
|
||||||
|
|
||||||
|
2
sign.sh
2
sign.sh
@@ -21,7 +21,7 @@ sign_file() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
# Update the Authenticode signature
|
# Update the Authenticode signature
|
||||||
cmd.exe /c '"C:\Program Files (x86)\Windows Kits\10\bin\10.0.22000.0\x64\signtool" sign /v /sha1 3dbc3a2a0e9ce8803b422cfdbc60acd33164965d /fd SHA256 /tr http://sha256timestamp.ws.symantec.com/sha256/timestamp /td SHA256 Fido.ps1'
|
MSYS2_ARG_CONV_EXCL='*' "C:\Program Files (x86)\Windows Kits\10\bin\10.0.22000.0\x64\signtool" sign /v /sha1 3dbc3a2a0e9ce8803b422cfdbc60acd33164965d /fd SHA256 /tr http://sha256timestamp.ws.symantec.com/sha256/timestamp /td SHA256 Fido.ps1
|
||||||
read -s -p "Enter pass phrase for `realpath $PRIVATE_KEY`: " PASSWORD
|
read -s -p "Enter pass phrase for `realpath $PRIVATE_KEY`: " PASSWORD
|
||||||
echo
|
echo
|
||||||
# Confirm that the pass phrase is valid by trying to sign a dummy file
|
# Confirm that the pass phrase is valid by trying to sign a dummy file
|
||||||
|
Reference in New Issue
Block a user