mirror of
https://github.com/pbatard/Fido.git
synced 2025-09-16 22:28:02 +02:00
Compare commits
24 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
4a694421af | ||
![]() |
15a1a5923d | ||
![]() |
85a29fa2ae | ||
![]() |
a99f8a10d3 | ||
![]() |
146eec8673 | ||
![]() |
e9a0a367d9 | ||
![]() |
0b0643abc8 | ||
![]() |
1d88deac7c | ||
![]() |
9025d258e8 | ||
![]() |
425eb4da24 | ||
![]() |
10acbf9f84 | ||
![]() |
4b24ae5795 | ||
![]() |
2ca0f62f53 | ||
![]() |
448cfa72cf | ||
![]() |
9552df66d5 | ||
![]() |
4bafb688da | ||
![]() |
ad79094c30 | ||
![]() |
8cf4a279ff | ||
![]() |
84f833b067 | ||
![]() |
c34a41fe3f | ||
![]() |
6593585ff3 | ||
![]() |
fac4c49262 | ||
![]() |
f8aacf0703 | ||
![]() |
24a7a04d78 |
@@ -2,7 +2,8 @@
|
||||
root = true
|
||||
|
||||
[*]
|
||||
trim_trailing_whitespace = true
|
||||
insert_final_newline = true
|
||||
# Must use a BOM else Unicode strings will not display
|
||||
charset = utf-8-bom
|
||||
insert_final_newline = true
|
||||
indent_style = tab
|
||||
trim_trailing_whitespace = true
|
||||
|
3
.gitattributes
vendored
3
.gitattributes
vendored
@@ -1,3 +1,6 @@
|
||||
* text=auto
|
||||
*.ps1 eol=crlf
|
||||
*.sh eol=lf
|
||||
.gitattributes export-ignore
|
||||
.gitignore export-ignore
|
||||
sign.sh export-ignore
|
||||
|
@@ -1,8 +0,0 @@
|
||||
{
|
||||
"checkRunSettings": {
|
||||
"vulnerableCheckRunConclusionLevel": "failure"
|
||||
},
|
||||
"issueSettings": {
|
||||
"minSeverityLevel": "LOW"
|
||||
}
|
||||
}
|
462
Fido.ps1
462
Fido.ps1
@@ -1,6 +1,6 @@
|
||||
#
|
||||
# Fido v1.34 - Feature ISO Downloader, for retail Windows images and UEFI Shell
|
||||
# Copyright © 2019-2022 Pete Batard <pete@akeo.ie>
|
||||
# Fido v1.50 - Feature ISO Downloader, for retail Windows images and UEFI Shell
|
||||
# Copyright © 2019-2023 Pete Batard <pete@akeo.ie>
|
||||
# Command line support: Copyright © 2021 flx5
|
||||
# ConvertTo-ImageSource: Copyright © 2016 Chris Carter
|
||||
#
|
||||
@@ -24,9 +24,11 @@
|
||||
#region Parameters
|
||||
param(
|
||||
# (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.
|
||||
[string]$LocData,
|
||||
# (Optional) Forced locale
|
||||
[string]$Locale = "en-US",
|
||||
# (Optional) Path to a file that should be used for the UI icon.
|
||||
[string]$Icon,
|
||||
# (Optional) Name of a pipe the download URL should be sent to.
|
||||
@@ -43,9 +45,9 @@ param(
|
||||
# (Optional) Specify Windows architecture [Toggles commandline mode]
|
||||
[string]$Arch,
|
||||
# (Optional) Only display the download URL [Toggles commandline mode]
|
||||
[switch]$GetUrl = $False,
|
||||
[switch]$GetUrl = $false,
|
||||
# (Optional) Increase verbosity
|
||||
[switch]$Verbose = $False
|
||||
[switch]$Verbose = $false
|
||||
)
|
||||
#endregion
|
||||
|
||||
@@ -53,21 +55,56 @@ try {
|
||||
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
|
||||
} catch {}
|
||||
|
||||
$Cmd = $False
|
||||
$Cmd = $false
|
||||
if ($Win -or $Rel -or $Ed -or $Lang -or $Arch -or $GetUrl) {
|
||||
$Cmd = $True
|
||||
$Cmd = $true
|
||||
}
|
||||
|
||||
# Return a decimal Windows version that we can then check for platform support.
|
||||
# Note that because we don't want to have to support this script on anything
|
||||
# other than Windows, this call returns 0.0 for PowerShell running on Linux/Mac.
|
||||
function Get-Platform-Version()
|
||||
{
|
||||
$version = 0.0
|
||||
$platform = [string][System.Environment]::OSVersion.Platform
|
||||
# This will filter out non Windows platforms
|
||||
if ($platform.StartsWith("Win")) {
|
||||
# Craft a decimal numeric version of Windows
|
||||
$version = [System.Environment]::OSVersion.Version.Major * 1.0 + [System.Environment]::OSVersion.Version.Minor * 0.1
|
||||
}
|
||||
return $version
|
||||
}
|
||||
|
||||
$winver = Get-Platform-Version
|
||||
|
||||
# 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
|
||||
$code = @"
|
||||
[DllImport("shell32.dll", CharSet = CharSet.Auto, SetLastError = true, BestFitMapping = false, ThrowOnUnmappableChar = true)]
|
||||
internal static extern int ExtractIconEx(string sFile, int iIndex, out IntPtr piLargeVersion, out IntPtr piSmallVersion, int amountIcons);
|
||||
[DllImport("user32.dll")]
|
||||
public static extern bool ShowWindow(IntPtr handle, int state);
|
||||
$Drawing_Assembly = "System.Drawing"
|
||||
# PowerShell 7 altered the name of the Drawing assembly...
|
||||
if ($host.version -ge "7.0") {
|
||||
$Drawing_Assembly += ".Common"
|
||||
}
|
||||
|
||||
$Signature = @{
|
||||
Namespace = "WinAPI"
|
||||
Name = "Utils"
|
||||
Language = "CSharp"
|
||||
UsingNamespace = "System.Runtime", "System.IO", "System.Text", "System.Drawing", "System.Globalization"
|
||||
ReferencedAssemblies = $Drawing_Assembly
|
||||
ErrorAction = "Stop"
|
||||
WarningAction = "Ignore"
|
||||
MemberDefinition = @"
|
||||
[DllImport("shell32.dll", CharSet = CharSet.Auto, SetLastError = true, BestFitMapping = false, ThrowOnUnmappableChar = true)]
|
||||
internal static extern int ExtractIconEx(string sFile, int iIndex, out IntPtr piLargeVersion, out IntPtr piSmallVersion, int amountIcons);
|
||||
|
||||
[DllImport("user32.dll")]
|
||||
public static extern bool ShowWindow(IntPtr handle, int state);
|
||||
// Extract an icon from a DLL
|
||||
public static Icon ExtractIcon(string file, int number, bool largeIcon)
|
||||
{
|
||||
public static Icon ExtractIcon(string file, int number, bool largeIcon) {
|
||||
IntPtr large, small;
|
||||
ExtractIconEx(file, number, out large, out small, 1);
|
||||
try {
|
||||
@@ -77,18 +114,19 @@ $code = @"
|
||||
}
|
||||
}
|
||||
"@
|
||||
}
|
||||
|
||||
if (!$Cmd) {
|
||||
Write-Host Please Wait...
|
||||
$Drawing_Assembly = "System.Drawing"
|
||||
# PowerShell 7 altered the name of the Drawing assembly...
|
||||
if ($host.version -ge "7.0") {
|
||||
$Drawing_Assembly += ".Common"
|
||||
|
||||
if (!("WinAPI.Utils" -as [type]))
|
||||
{
|
||||
Add-Type @Signature
|
||||
}
|
||||
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
|
||||
|
||||
# Hide the powershell window: https://stackoverflow.com/a/27992426/1069307
|
||||
[Gui.Utils]::ShowWindow(([System.Diagnostics.Process]::GetCurrentProcess() | Get-Process).MainWindowHandle, 0) | Out-Null
|
||||
[WinAPI.Utils]::ShowWindow(([System.Diagnostics.Process]::GetCurrentProcess() | Get-Process).MainWindowHandle, 0) | Out-Null
|
||||
}
|
||||
#endregion
|
||||
|
||||
@@ -99,164 +137,19 @@ $WindowsVersions = @(
|
||||
@(
|
||||
@("Windows 11", "windows11"),
|
||||
@(
|
||||
"22H2 (Build 22621.382 - 2022.09)",
|
||||
@("Windows 11 Home/Pro/Edu", 2360),
|
||||
@("Windows 11 Home China ", ($zh + 2361))
|
||||
),
|
||||
@(
|
||||
"21H2 v1 (Build 22000.318 - 2021.11)",
|
||||
@("Windows 11 Home/Pro/Edu", 2093),
|
||||
@("Windows 11 Home China ", ($zh + 2094))
|
||||
),
|
||||
@(
|
||||
"21H2 (Build 22000.194 - 2021.10)",
|
||||
@("Windows 11 Home/Pro/Edu", 2069),
|
||||
@("Windows 11 Home China ", ($zh + 2070))
|
||||
"22H2 v2 (Build 22621.1702 - 2023.05)",
|
||||
@("Windows 11 Home/Pro/Edu", 2616),
|
||||
@("Windows 11 Home China ", ($zh + 2617))
|
||||
)
|
||||
),
|
||||
@(
|
||||
@("Windows 10", "Windows10ISO"),
|
||||
@(
|
||||
"21H2 (Build 19044.1288 - 2021.11)",
|
||||
@("Windows 10 Home/Pro/Edu", 2084),
|
||||
@("Windows 10 Home China ", ($zh + 2085))
|
||||
),
|
||||
@(
|
||||
"21H1 (Build 19043.985 - 2021.05)",
|
||||
@("Windows 10 Home/Pro", 2033),
|
||||
@("Windows 10 Education", 2032),
|
||||
@("Windows 10 Home China ", ($zh + 2034))
|
||||
),
|
||||
@(
|
||||
"20H2 (Build 19042.631 - 2020.12)",
|
||||
@("Windows 10 Home/Pro", 1882),
|
||||
@("Windows 10 Education", 1884),
|
||||
@("Windows 10 Home China ", ($zh + 1883))
|
||||
),
|
||||
@(
|
||||
"20H2 (Build 19042.508 - 2020.10)",
|
||||
@("Windows 10 Home/Pro", 1807),
|
||||
@("Windows 10 Education", 1805),
|
||||
@("Windows 10 Home China ", ($zh + 1806))
|
||||
),
|
||||
@(
|
||||
"20H1 (Build 19041.264 - 2020.05)",
|
||||
@("Windows 10 Home/Pro", 1626),
|
||||
@("Windows 10 Education", 1625),
|
||||
@("Windows 10 Home China ", ($zh + 1627))
|
||||
),
|
||||
@(
|
||||
"19H2 (Build 18363.418 - 2019.11)",
|
||||
@("Windows 10 Home/Pro", 1429),
|
||||
@("Windows 10 Education", 1431),
|
||||
@("Windows 10 Home China ", ($zh + 1430))
|
||||
),
|
||||
@(
|
||||
"19H1 (Build 18362.356 - 2019.09)",
|
||||
@("Windows 10 Home/Pro", 1384),
|
||||
@("Windows 10 Education", 1386),
|
||||
@("Windows 10 Home China ", ($zh + 1385))
|
||||
),
|
||||
@(
|
||||
"19H1 (Build 18362.30 - 2019.05)",
|
||||
@("Windows 10 Home/Pro", 1214),
|
||||
@("Windows 10 Education", 1216),
|
||||
@("Windows 10 Home China ", ($zh + 1215))
|
||||
),
|
||||
@(
|
||||
"1809 R3 (Build 17763.379 - 2019.03)",
|
||||
@("Windows 10 Home/Pro", 1203),
|
||||
@("Windows 10 Education", 1202),
|
||||
@("Windows 10 Home China ", ($zh + 1204))
|
||||
),
|
||||
@(
|
||||
"1809 R2 (Build 17763.107 - 2018.10)",
|
||||
@("Windows 10 Home/Pro", 1060),
|
||||
@("Windows 10 Education", 1056),
|
||||
@("Windows 10 Home China ", ($zh + 1061))
|
||||
),
|
||||
@(
|
||||
"1809 R1 (Build 17763.1 - 2018.09)",
|
||||
@("Windows 10 Home/Pro", 1019),
|
||||
@("Windows 10 Education", 1021),
|
||||
@("Windows 10 Home China ", ($zh + 1020))
|
||||
),
|
||||
@(
|
||||
"1803 (Build 17134.1 - 2018.04)",
|
||||
@("Windows 10 Home/Pro", 651),
|
||||
@("Windows 10 Education", 655),
|
||||
@("Windows 10 1803", 637),
|
||||
@("Windows 10 Home China", ($zh + 652))
|
||||
),
|
||||
@(
|
||||
"1709 (Build 16299.15 - 2017.09)",
|
||||
@("Windows 10 Home/Pro", 484),
|
||||
@("Windows 10 Education", 488),
|
||||
@("Windows 10 Home China", ($zh + 485))
|
||||
),
|
||||
@(
|
||||
"1703 [Redstone 2] (Build 15063.0 - 2017.03)",
|
||||
@("Windows 10 Home/Pro", 361),
|
||||
@("Windows 10 Home/Pro N", 362),
|
||||
@("Windows 10 Single Language", 363),
|
||||
@("Windows 10 Education", 423),
|
||||
@("Windows 10 Education N", 424),
|
||||
@("Windows 10 Home China", ($zh + 364))
|
||||
),
|
||||
@(
|
||||
"1607 [Redstone 1] (Build 14393.0 - 2016.07)",
|
||||
@("Windows 10 Home/Pro", 244),
|
||||
@("Windows 10 Home/Pro N", 245),
|
||||
@("Windows 10 Single Language", 246),
|
||||
@("Windows 10 Education", 242),
|
||||
@("Windows 10 Education N", 243),
|
||||
@("Windows 10 China Get Genuine", ($zh + 247))
|
||||
),
|
||||
@(
|
||||
"1511 R3 [Threshold 2] (Build 10586.164 - 2016.04)",
|
||||
@("Windows 10 Home/Pro", 178),
|
||||
@("Windows 10 Home/Pro N", 183),
|
||||
@("Windows 10 Single Language", 184),
|
||||
@("Windows 10 Education", 179),
|
||||
@("Windows 10 Education N", 181),
|
||||
@("Windows 10 KN", ($ko + 182)),
|
||||
@("Windows 10 Education KN", ($ko + 180)),
|
||||
@("Windows 10 China Get Genuine", ($zh + 185))
|
||||
),
|
||||
@(
|
||||
"1511 R2 [Threshold 2] (Build 10586.104 - 2016.02)",
|
||||
@("Windows 10 Home/Pro", 109),
|
||||
@("Windows 10 Home/Pro N", 115),
|
||||
@("Windows 10 Single Language", 116),
|
||||
@("Windows 10 Education", 110),
|
||||
@("Windows 10 Education N", 112),
|
||||
@("Windows 10 KN", ($ko + 114)),
|
||||
@("Windows 10 Education KN", ($ko + 111)),
|
||||
@("Windows 10 China Get Genuine", ($zh + 113))
|
||||
),
|
||||
@(
|
||||
"1511 R1 [Threshold 2] (Build 10586.0 - 2015.11)",
|
||||
@("Windows 10 Home/Pro", 99),
|
||||
@("Windows 10 Home/Pro N", 105),
|
||||
@("Windows 10 Single Language", 106),
|
||||
@("Windows 10 Education", 100),
|
||||
@("Windows 10 Education N", 102),
|
||||
@("Windows 10 KN", ($ko + 104)),
|
||||
@("Windows 10 Education KN", ($ko + 101)),
|
||||
@("Windows 10 China Get Genuine", ($zh + 103))
|
||||
),
|
||||
@(
|
||||
"1507 [Threshold 1] (Build 10240.16384 - 2015.07)",
|
||||
@("Windows 10 Home/Pro", 79),
|
||||
@("Windows 10 Home/Pro N", 81),
|
||||
@("Windows 10 Single Language", 82),
|
||||
@("Windows 10 Education", 75)
|
||||
@("Windows 10 Education N", 77),
|
||||
@("Windows 10 KN", ($ko + 80)),
|
||||
@("Windows 10 Education KN", ($ko + 76)),
|
||||
@("Windows 10 China Get Genuine", ($zh + 78))
|
||||
"22H2 v1 (Build 19045.2965 - 2023.05)",
|
||||
@("Windows 10 Home/Pro/Edu", 2618),
|
||||
@("Windows 10 Home China ", ($zh + 2378))
|
||||
)
|
||||
)
|
||||
),
|
||||
@(
|
||||
@("Windows 8.1", "windows8ISO"),
|
||||
@(
|
||||
@@ -269,16 +162,17 @@ $WindowsVersions = @(
|
||||
)
|
||||
),
|
||||
@(
|
||||
@("Windows 7", "WIN7"),
|
||||
@("UEFI Shell 2.2", "UEFI_SHELL 2.2"),
|
||||
@(
|
||||
"with SP1 (build 7601)",
|
||||
@("Windows 7 Ultimate", 0),
|
||||
@("Windows 7 Professional", 1),
|
||||
@("Windows 7 Home Premium", 2)
|
||||
)
|
||||
"23H1 (edk2-stable202305)",
|
||||
@("Release", 0),
|
||||
@("Debug", 1)
|
||||
),
|
||||
@(
|
||||
@("UEFI Shell 2.2", "UEFI_SHELL 2.2"),
|
||||
"22H2 (edk2-stable202211)",
|
||||
@("Release", 0),
|
||||
@("Debug", 1)
|
||||
),
|
||||
@(
|
||||
"22H1 (edk2-stable202205)",
|
||||
@("Release", 0),
|
||||
@@ -308,42 +202,6 @@ $WindowsVersions = @(
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
$Windows7Versions = @(
|
||||
# 0: Windows 7 Ultimate
|
||||
@(
|
||||
# Need a dummy to prevent PS from coalescing single array entries
|
||||
@(""),
|
||||
@("English (US)", "en-us",
|
||||
@(
|
||||
@("x64", "https://download.microsoft.com/download/5/1/9/5195A765-3A41-4A72-87D8-200D897CBE21/7601.24214.180801-1700.win7sp1_ldr_escrow_CLIENT_ULTIMATE_x64FRE_en-us.iso"),
|
||||
@("x86", "https://download.microsoft.com/download/1/E/6/1E6B4803-DD2A-49DF-8468-69C0E6E36218/7601.24214.180801-1700.win7sp1_ldr_escrow_CLIENT_ULTIMATE_x86FRE_en-us.iso")
|
||||
)
|
||||
)
|
||||
),
|
||||
# 1: Windows 7 Profesional
|
||||
@(
|
||||
@(""),
|
||||
@("English (US)", "en-us",
|
||||
@(
|
||||
@("x64", "https://download.microsoft.com/download/0/6/3/06365375-C346-4D65-87C7-EE41F55F736B/7601.24214.180801-1700.win7sp1_ldr_escrow_CLIENT_PROFESSIONAL_x64FRE_en-us.iso"),
|
||||
@("x86", "https://download.microsoft.com/download/C/0/6/C067D0CD-3785-4727-898E-60DC3120BB14/7601.24214.180801-1700.win7sp1_ldr_escrow_CLIENT_PROFESSIONAL_x86FRE_en-us.iso")
|
||||
)
|
||||
)
|
||||
),
|
||||
# 2: Windows 7 Home Premium
|
||||
@(
|
||||
@(""),
|
||||
@("English (US)", "en-us",
|
||||
@(
|
||||
@("x64", "https://download.microsoft.com/download/E/A/8/EA804D86-C3DF-4719-9966-6A66C9306598/7601.24214.180801-1700.win7sp1_ldr_escrow_CLIENT_HOMEPREMIUM_x64FRE_en-us.iso"),
|
||||
@("x86", "https://download.microsoft.com/download/E/D/A/EDA6B508-7663-4E30-86F9-949932F443D0/7601.24214.180801-1700.win7sp1_ldr_escrow_CLIENT_HOMEPREMIUM_x86FRE_en-us.iso")
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
)
|
||||
#endregion
|
||||
|
||||
#region Functions
|
||||
@@ -393,9 +251,9 @@ function Select-Language([string]$LangName)
|
||||
($SysLocale.StartsWith("tr") -and $LangName -like "*Turk*") -or `
|
||||
($SysLocale.StartsWith("uk") -and $LangName -like "*Ukrain*") -or `
|
||||
($SysLocale.StartsWith("vi") -and $LangName -like "*Vietnam*")) {
|
||||
return $True
|
||||
return $true
|
||||
}
|
||||
return $False
|
||||
return $false
|
||||
}
|
||||
|
||||
function Add-Entry([int]$pos, [string]$Name, [array]$Items, [string]$DisplayName)
|
||||
@@ -487,8 +345,8 @@ function ConvertTo-ImageSource
|
||||
|
||||
function Throw-Error([object]$Req, [string]$Alt)
|
||||
{
|
||||
$Err = $(GetElementById -Request $r -Id "errorModalMessage").innerText
|
||||
if (-not $Err) {
|
||||
$Err = $(GetElementById -Request $Req -Id "errorModalMessage").innerText -replace "<[^>]+>" -replace "\s+", " "
|
||||
if (!$Err) {
|
||||
$Err = $Alt
|
||||
} else {
|
||||
$Err = [System.Text.Encoding]::UTF8.GetString([byte[]][char[]]$Err)
|
||||
@@ -499,7 +357,7 @@ function Throw-Error([object]$Req, [string]$Alt)
|
||||
# Translate a message string
|
||||
function Get-Translation([string]$Text)
|
||||
{
|
||||
if (-not $English -contains $Text) {
|
||||
if (!($English -contains $Text)) {
|
||||
Write-Host "Error: '$Text' is not a translatable string"
|
||||
return "(Untranslated)"
|
||||
}
|
||||
@@ -537,7 +395,7 @@ function Error([string]$ErrorMessage)
|
||||
if (!$Cmd) {
|
||||
$XMLForm.Title = $(Get-Translation("Error")) + ": " + $ErrorMessage
|
||||
Refresh-Control($XMLForm)
|
||||
$XMLGrid.Children[2 * $script:Stage + 1].IsEnabled = $True
|
||||
$XMLGrid.Children[2 * $script:Stage + 1].IsEnabled = $true
|
||||
$UserInput = [System.Windows.MessageBox]::Show($XMLForm.Title, $(Get-Translation("Error")), "OK", "Error")
|
||||
$script:ExitCode = $script:Stage--
|
||||
} else {
|
||||
@@ -583,14 +441,14 @@ if ($Cmd) {
|
||||
$MaxStage = 4
|
||||
$SessionId = [guid]::NewGuid()
|
||||
$ExitCode = 100
|
||||
$Locale = "en-US"
|
||||
$Locale = $Locale
|
||||
$RequestData = @{}
|
||||
# This GUID applies to all visitors, regardless of their locale
|
||||
$RequestData["GetLangs"] = @("a8f8f489-4c7f-463a-9ca6-5cff94d8d041", "getskuinformationbyproductedition" )
|
||||
# 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" )
|
||||
# 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
|
||||
$UserAgent = "Mozilla/5.0 (X11; Linux i586; rv:$FirefoxVersion.0) Gecko/$FirefoxDate Firefox/$FirefoxVersion.0"
|
||||
$Verbosity = 2
|
||||
@@ -605,30 +463,25 @@ if ($Cmd) {
|
||||
|
||||
# Localization
|
||||
$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...|" +
|
||||
"PowerShell 3.0 or later is required to run this script.|Do you want to go online and download it?"
|
||||
"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?|" +
|
||||
"This feature is not available on this platform."
|
||||
[string[]]$English = $EnglishMessages.Split('|')
|
||||
[string[]]$Localized = $null
|
||||
if ($LocData -and (-not $LocData.StartsWith("en-US"))) {
|
||||
if ($LocData -and !$LocData.StartsWith("en-US")) {
|
||||
$Localized = $LocData.Split('|')
|
||||
if ($Localized.Length -ne $English.Length) {
|
||||
Write-Host "Error: Missing or extra translated messages provided ($($Localized.Length)/$($English.Length))"
|
||||
exit 101
|
||||
# Adjust the $Localized array if we have more or fewer strings than in $EnglishMessages
|
||||
if ($Localized.Length -lt $English.Length) {
|
||||
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]
|
||||
}
|
||||
$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
|
||||
function Size-To-Human-Readable([uint64]$size)
|
||||
{
|
||||
@@ -642,7 +495,8 @@ function Size-To-Human-Readable([uint64]$size)
|
||||
}
|
||||
|
||||
# Check if the locale we want is available - Fall back to en-US otherwise
|
||||
function Check-Locale {
|
||||
function Check-Locale
|
||||
{
|
||||
try {
|
||||
$url = "https://www.microsoft.com/" + $QueryLocale + "/software-download/"
|
||||
if ($Verbosity -ge 2) {
|
||||
@@ -698,6 +552,17 @@ function Get-Windows-Languages([int]$SelectedVersion, [int]$SelectedEdition)
|
||||
} elseif ($WindowsVersions[$SelectedVersion][0][1].StartsWith("UEFI_SHELL")) {
|
||||
$languages += @(New-Object PsObject -Property @{ DisplayLanguage = "English (US)"; Language = "en-us"; Id = 0 })
|
||||
} 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 += "?pageId=" + $RequestData["GetLangs"][0]
|
||||
$url += "&host=www.microsoft.com"
|
||||
@@ -712,11 +577,12 @@ function Get-Windows-Languages([int]$SelectedVersion, [int]$SelectedEdition)
|
||||
|
||||
$script:SelectedIndex = 0
|
||||
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") {
|
||||
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
|
||||
# Go through an XML conversion to keep all PowerShells happy...
|
||||
$html = $html.Replace("selected value", "value")
|
||||
@@ -799,20 +665,18 @@ function Get-Windows-Download-Links([int]$SelectedVersion, [int]$SelectedRelease
|
||||
|
||||
try {
|
||||
$Is64 = [Environment]::Is64BitOperatingSystem
|
||||
# Must add a referer for POST requests, else Microsoft's servers will deny them
|
||||
# Must add a referer for this request, else Microsoft's servers will deny it
|
||||
$ref = "https://www.microsoft.com/software-download/windows11"
|
||||
$wr = [System.Net.WebRequest]::Create($url)
|
||||
# Windows 7 PowerShell doesn't support 'Invoke-WebRequest -Headers @{"Referer" = $ref}'
|
||||
# (produces "The 'Referer' header must be modified using the appropriate property or method")
|
||||
# so we use StreamReader() with GetResponseStream() and do this whole gymkhana instead...
|
||||
$wr.Method = "POST"
|
||||
$wr.Referer = $ref
|
||||
$wr.UserAgent = $UserAgent
|
||||
$wr.ContentLength = 0
|
||||
$sr = New-Object System.IO.StreamReader($wr.GetResponse().GetResponseStream())
|
||||
$r = $sr.ReadToEnd()
|
||||
$r = Invoke-WebRequest -Method Post -Headers @{ "Referer" = $ref } -UseBasicParsing -UserAgent $UserAgent -WebSession $Session $url
|
||||
if ($r -match "errorModalMessage") {
|
||||
Throw-Error -Req $r -Alt "Could not retrieve architectures from server"
|
||||
$Alt = [regex]::Match($r.Content, '<p id="errorModalMessage">(.+?)<\/p>').Groups[1].Value -replace "<[^>]+>" -replace "\s+", " " -replace "\?\?\?", "-"
|
||||
$Alt = [System.Text.Encoding]::UTF8.GetString([byte[]][char[]]$Alt)
|
||||
if (!$Alt) {
|
||||
$Alt = "Could not retrieve architectures from server"
|
||||
} elseif ($Alt -match "715-123130") {
|
||||
$Alt += " " + $SessionId + "."
|
||||
}
|
||||
Throw-Error -Req $r -Alt $Alt
|
||||
}
|
||||
$pattern = '(?s)(<input.*?></input>)'
|
||||
ForEach-Object { [regex]::Matches($r, $pattern) } | ForEach-Object { $html += $_.Groups[1].value }
|
||||
@@ -827,7 +691,7 @@ function Get-Windows-Download-Links([int]$SelectedVersion, [int]$SelectedRelease
|
||||
foreach ($var in $xml.inputs.input) {
|
||||
$json = $var.value | ConvertFrom-Json;
|
||||
if ($json) {
|
||||
if (($Is64 -and $json.DownloadType -eq "x64") -or (-not $Is64 -and $json.DownloadType -eq "x86")) {
|
||||
if (($Is64 -and $json.DownloadType -eq "x64") -or (!$Is64 -and $json.DownloadType -eq "x86")) {
|
||||
$script:SelectedIndex = $i
|
||||
}
|
||||
$links += @(New-Object PsObject -Property @{ Type = $json.DownloadType; Link = $json.Uri })
|
||||
@@ -849,7 +713,7 @@ function Get-Windows-Download-Links([int]$SelectedVersion, [int]$SelectedRelease
|
||||
function Process-Download-Link([string]$Url)
|
||||
{
|
||||
try {
|
||||
if ($PipeName -and -not $Check.IsChecked) {
|
||||
if ($PipeName -and !$Check.IsChecked) {
|
||||
Send-Message -PipeName $PipeName -Message $Url
|
||||
} else {
|
||||
if ($Cmd) {
|
||||
@@ -860,7 +724,7 @@ function Process-Download-Link([string]$Url)
|
||||
$tmp_size = [uint64]::Parse($str_size)
|
||||
$Size = Size-To-Human-Readable $tmp_size
|
||||
Write-Host "Downloading '$File' ($Size)..."
|
||||
Invoke-WebRequest -UseBasicParsing -Uri $Url -OutFile $File
|
||||
Start-BitsTransfer -Source $Url -Destination $File
|
||||
} else {
|
||||
Write-Host Download Link: $Url
|
||||
Start-Process -FilePath $Url
|
||||
@@ -881,6 +745,12 @@ if ($Cmd) {
|
||||
$winLanguageName = $null
|
||||
$winLink = $null
|
||||
|
||||
# Windows 7 and non Windows platforms are too much of a liability
|
||||
if ($winver -le 6.1) {
|
||||
Error(Get-Translation("This feature is not available on this platform."))
|
||||
exit 403
|
||||
}
|
||||
|
||||
$i = 0
|
||||
$Selected = ""
|
||||
if ($Win -eq "List") {
|
||||
@@ -941,7 +811,7 @@ if ($Cmd) {
|
||||
if (!$Ed -and $Verbosity -ge 1) {
|
||||
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
|
||||
break;
|
||||
}
|
||||
@@ -1039,7 +909,7 @@ $XMLForm.Title = $AppTitle
|
||||
if ($Icon) {
|
||||
$XMLForm.Icon = $Icon
|
||||
} else {
|
||||
$XMLForm.Icon = [Gui.Utils]::ExtractIcon("shell32.dll", -41, $true) | ConvertTo-ImageSource
|
||||
$XMLForm.Icon = [WinAPI.Utils]::ExtractIcon("imageres.dll", -5205, $true) | ConvertTo-ImageSource
|
||||
}
|
||||
if ($Locale.StartsWith("ar") -or $Locale.StartsWith("fa") -or $Locale.StartsWith("he")) {
|
||||
$XMLForm.FlowDirection = "RightToLeft"
|
||||
@@ -1048,6 +918,12 @@ $WindowsVersionTitle.Text = Get-Translation("Version")
|
||||
$Continue.Content = Get-Translation("Continue")
|
||||
$Back.Content = Get-Translation("Close")
|
||||
|
||||
# Windows 7 and non Windows platforms are too much of a liability
|
||||
if ($winver -le 6.1) {
|
||||
Error(Get-Translation("This feature is not available on this platform."))
|
||||
exit 403
|
||||
}
|
||||
|
||||
# Populate the Windows versions
|
||||
$i = 0
|
||||
$versions = @()
|
||||
@@ -1061,9 +937,9 @@ $WindowsVersion.DisplayMemberPath = "Version"
|
||||
# Button Action
|
||||
$Continue.add_click({
|
||||
$script:Stage++
|
||||
$XMLGrid.Children[2 * $Stage + 1].IsEnabled = $False
|
||||
$Continue.IsEnabled = $False
|
||||
$Back.IsEnabled = $False
|
||||
$XMLGrid.Children[2 * $Stage + 1].IsEnabled = $false
|
||||
$Continue.IsEnabled = $false
|
||||
$Back.IsEnabled = $false
|
||||
Refresh-Control($Continue)
|
||||
Refresh-Control($Back)
|
||||
|
||||
@@ -1072,7 +948,7 @@ $Continue.add_click({
|
||||
1 { # Windows Version selection
|
||||
$XMLForm.Title = Get-Translation($English[12])
|
||||
Refresh-Control($XMLForm)
|
||||
if ($WindowsVersion.SelectedValue.Version.StartsWith("Windows") -and $WindowsVersion.SelectedValue.Version -ne "Windows 7") {
|
||||
if ($WindowsVersion.SelectedValue.Version.StartsWith("Windows")) {
|
||||
Check-Locale
|
||||
}
|
||||
$releases = Get-Windows-Releases $WindowsVersion.SelectedValue.Index
|
||||
@@ -1131,9 +1007,9 @@ $Continue.add_click({
|
||||
$XMLForm.Close()
|
||||
}
|
||||
}
|
||||
$Continue.IsEnabled = $True
|
||||
$Continue.IsEnabled = $true
|
||||
if ($Stage -ge 0) {
|
||||
$Back.IsEnabled = $True
|
||||
$Back.IsEnabled = $true
|
||||
}
|
||||
})
|
||||
|
||||
@@ -1143,7 +1019,7 @@ $Back.add_click({
|
||||
} else {
|
||||
$XMLGrid.Children.RemoveAt(2 * $Stage + 3)
|
||||
$XMLGrid.Children.RemoveAt(2 * $Stage + 2)
|
||||
$XMLGrid.Children[2 * $Stage + 1].IsEnabled = $True
|
||||
$XMLGrid.Children[2 * $Stage + 1].IsEnabled = $true
|
||||
$dh2 = $dh
|
||||
if ($Stage -eq 4 -and $PipeName) {
|
||||
$Check.Visibility = "Collapsed"
|
||||
@@ -1168,7 +1044,7 @@ $Back.add_click({
|
||||
})
|
||||
|
||||
# Display the dialog
|
||||
$XMLForm.Add_Loaded( { $XMLForm.Activate() } )
|
||||
$XMLForm.Add_Loaded({$XMLForm.Activate()})
|
||||
$XMLForm.ShowDialog() | Out-Null
|
||||
|
||||
# Clean up & exit
|
||||
@@ -1177,8 +1053,8 @@ exit $ExitCode
|
||||
# SIG # Begin signature block
|
||||
# MIIkWQYJKoZIhvcNAQcCoIIkSjCCJEYCAQExDzANBglghkgBZQMEAgEFADB5Bgor
|
||||
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
|
||||
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCALq9WUjK/n7osl
|
||||
# kwRBr6duVZgEzaRe3mDKv+dLomlaQaCCElkwggVvMIIEV6ADAgECAhBI/JO0YFWU
|
||||
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCDGtmQ3n2+aDS3/
|
||||
# QYCl5G5W0g17so4OQ4o2zs/2W6PNjaCCElkwggVvMIIEV6ADAgECAhBI/JO0YFWU
|
||||
# jTanyYqJ1pQWMA0GCSqGSIb3DQEBDAUAMHsxCzAJBgNVBAYTAkdCMRswGQYDVQQI
|
||||
# DBJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoM
|
||||
# EUNvbW9kbyBDQSBMaW1pdGVkMSEwHwYDVQQDDBhBQUEgQ2VydGlmaWNhdGUgU2Vy
|
||||
@@ -1281,23 +1157,23 @@ exit $ExitCode
|
||||
# aWMgQ29kZSBTaWduaW5nIENBIEVWIFIzNgIRAL+xUAG79ZLUlip3l+pzb6MwDQYJ
|
||||
# YIZIAWUDBAIBBQCgfDAQBgorBgEEAYI3AgEMMQIwADAZBgkqhkiG9w0BCQMxDAYK
|
||||
# KwYBBAGCNwIBBDAcBgorBgEEAYI3AgELMQ4wDAYKKwYBBAGCNwIBFTAvBgkqhkiG
|
||||
# 9w0BCQQxIgQgFTNCPPaPOvuFXjtSmSj6kmL7aelK+dtEo03k3KPZTlQwDQYJKoZI
|
||||
# hvcNAQEBBQAEggIAeNJXRkURPIcJyxDqW8X4frFhcWLt0akkWfV2btU74/OpewpH
|
||||
# TPDADh93//9j01mOrbbFovL+5y3G/WE3EeLuzqvrfZC6g+McInSpK9wYeOEzjkfH
|
||||
# 4ACKOImDO5WNXILKtTQyfVwRuTgmWPb6SCC6HJIipciGlfuvrNcDMBjMyAbWblLe
|
||||
# OsU/N4lf1Wjd5oaM5b9kaZ7jwHLy1LderrvE0TZW7SqttfsPuqYI+QBq7ZrIxPcW
|
||||
# JKExxsWXLAAjxaSTHSTvYBE8uSA0ptEWna46mTywe6mkOHSDpnJBldwlINpNtfEl
|
||||
# wDxZ5x3phesQ71RjaE5YYupc5lt2gmpN0xz+l5Hj31wh9at8wusIYEiERWg1lBGi
|
||||
# oZZDLoNz2xjpWnPdOWaJnXKXJ7+iz28+BgjbcvMik3T0EtB41fvImq/y6UGk4vSE
|
||||
# yYQ6NFadcuCRS7yNiiP1aNw+SuZeq7rqBHlURgMP8Bck4sJIUfM3N4ONlKShBq1K
|
||||
# lq9W0IjKYVtLPSihQAbHx63DkmsJsgXlraQ9oVbhrOI5uEr03EDw1GYWrsJRiBRL
|
||||
# YQReZP6clxEoTSHqseDFm+HWmi4hv2YuVtSVobQFax5ljn5nkXRGbjIr39lE+tX6
|
||||
# loXHW4+c9R5cgyCGUCWg4HVNMSXZbNjvSVOIRxK1cDg+62XYCpAUDVCf2f2hgg49
|
||||
# 9w0BCQQxIgQgqI1odhSqONJF2lRMdXu4ORCaEGil+U1oiTim+axMgQswDQYJKoZI
|
||||
# hvcNAQEBBQAEggIAiXrNq3R4DHXMlP2rZhQ1rM8iKtYSd/VEn4L4BOzx0lHsZuHB
|
||||
# kkyh032NuzYTqjM2An4nzx5wsoepygyZ9MxXvVls3TaQyH5f0xRyXCluBEEEClLu
|
||||
# 6jxFD94rKc1oKDsvN/w+6dZd1XDphJPbJWkne83/0VbEVUw92+mH9Xf3S1FmTStS
|
||||
# sRJ4IND5oNnDB1LJuVQZfY9FM5Fxs/uy/uukV3y2pTfwvrkZK40Q5G26cSv8K657
|
||||
# dmZG1mo3hoqUZn7t9Bv8dmodHHLAC9dYH8rqV4fRKtBrBi6cZJgYxI+Nj9aGYMpu
|
||||
# wV+ue9FsFG9NoDKSEnM9W7BaEsGIa+EvBfs7qgwnAGkXC1UmeNQZ8vgUTnw2XsNH
|
||||
# sGdCcMqk94xJxl/EKQqKGuL18A/9h4SqXzI6gmsYoHgSYzwbMLmtUqmAd2zJso2L
|
||||
# ms37ru7S0ER/r+qGisGHIGz52JLB5+7EpiUgN6U5NLlRgHONuPyU57ZdmezVZTor
|
||||
# /LkjB9gyFcK5Lxw/sVWW1Naug94zk8nLRoMwHZK3L360otRCOdXikNoerjPAJC9W
|
||||
# ghkn1+4NapO0tx4VkX9qJlodr9hGoLSLgEhLHAAjhAClm6mYDXze5k9koRgHdNTO
|
||||
# jHUYgiXKdfAvYm7Iypyu4u94+9/Il/vhesT9pdOuMptEmGTc0XoXHE0q0QOhgg49
|
||||
# MIIOOQYKKwYBBAGCNwMDATGCDikwgg4lBgkqhkiG9w0BBwKggg4WMIIOEgIBAzEN
|
||||
# MAsGCWCGSAFlAwQCATCCAQ8GCyqGSIb3DQEJEAEEoIH/BIH8MIH5AgEBBgtghkgB
|
||||
# hvhFAQcXAzAxMA0GCWCGSAFlAwQCAQUABCD5Ric03I9pVDsoAfQBikG2Nk8QtF+C
|
||||
# jRKwiA3WiZoyAAIVAKlIW+qovWh/vTmKAgLa7ii9nmKzGA8yMDIyMDkyMzE2MDEy
|
||||
# OVowAwIBHqCBhqSBgzCBgDELMAkGA1UEBhMCVVMxHTAbBgNVBAoTFFN5bWFudGVj
|
||||
# hvhFAQcXAzAxMA0GCWCGSAFlAwQCAQUABCCGTHEH/YFvwzN9ftG5vgGNcw48oXKB
|
||||
# vSWgr6uJhhd/sAIVALFP5vbHzozqF47S9d7MZCpSHSvJGA8yMDIzMDYwNjEyNDgz
|
||||
# OFowAwIBHqCBhqSBgzCBgDELMAkGA1UEBhMCVVMxHTAbBgNVBAoTFFN5bWFudGVj
|
||||
# IENvcnBvcmF0aW9uMR8wHQYDVQQLExZTeW1hbnRlYyBUcnVzdCBOZXR3b3JrMTEw
|
||||
# LwYDVQQDEyhTeW1hbnRlYyBTSEEyNTYgVGltZVN0YW1waW5nIFNpZ25lciAtIEcz
|
||||
# oIIKizCCBTgwggQgoAMCAQICEHsFsdRJaFFE98mJ0pwZnRIwDQYJKoZIhvcNAQEL
|
||||
@@ -1360,13 +1236,13 @@ exit $ExitCode
|
||||
# BgNVBAoTFFN5bWFudGVjIENvcnBvcmF0aW9uMR8wHQYDVQQLExZTeW1hbnRlYyBU
|
||||
# cnVzdCBOZXR3b3JrMSgwJgYDVQQDEx9TeW1hbnRlYyBTSEEyNTYgVGltZVN0YW1w
|
||||
# aW5nIENBAhB71OWvuswHP6EBIwQiQU0SMAsGCWCGSAFlAwQCAaCBpDAaBgkqhkiG
|
||||
# 9w0BCQMxDQYLKoZIhvcNAQkQAQQwHAYJKoZIhvcNAQkFMQ8XDTIyMDkyMzE2MDEy
|
||||
# OVowLwYJKoZIhvcNAQkEMSIEIByRkrigMw50nFG5C1eKvrGlS8ZnhBTXMhAhFl6x
|
||||
# GwufMDcGCyqGSIb3DQEJEAIvMSgwJjAkMCIEIMR0znYAfQI5Tg2l5N58FMaA+eKC
|
||||
# ATz+9lPvXbcf32H4MAsGCSqGSIb3DQEBAQSCAQBrJmQv2jU+K0w+IZbPxhLWTWse
|
||||
# LZUtQ31RIaZsNPo1Tqdx16bGqoA+JvBXffyDnnMQxVVNBrKqnPBEfff09WPeVWyn
|
||||
# SeLQJYmZPtt9ww3/9aJFmSkgeXPTJi/qBn+iymIEvYxgr1DbAY2STY05c/dwDF53
|
||||
# 760Bu3acQsT7cDMqgPxEMoIPYJRTdXXL8uBKUEZyWgHWYASpboljFSXBb0v6Hekp
|
||||
# 7hf4GPm80eOntPWpACN161wPLj9K5e7eu7/ZR9oyMWI5C/ckFnsxQgHXjEfmRK3C
|
||||
# P9iecy4hm1QE4UmDuY/DpOcodqaKT3nZ8aAdkIkHV1ayew3lrNgT8n5gfCCp
|
||||
# 9w0BCQMxDQYLKoZIhvcNAQkQAQQwHAYJKoZIhvcNAQkFMQ8XDTIzMDYwNjEyNDgz
|
||||
# OFowLwYJKoZIhvcNAQkEMSIEIEhEOEtGrZEgb+EarYUzmFPk8jBv87RW0Uj0gh2x
|
||||
# BtS/MDcGCyqGSIb3DQEJEAIvMSgwJjAkMCIEIMR0znYAfQI5Tg2l5N58FMaA+eKC
|
||||
# ATz+9lPvXbcf32H4MAsGCSqGSIb3DQEBAQSCAQCGb3w7mUJobd+bURtqSY0Fn1zv
|
||||
# SMe/Sf2G9CSCHx90UFHL7jfcamMFBteqepXSWNfwCGWnLKn4lhxLXNpT2f680a+H
|
||||
# N0xwU5xE7Wgmg6GGNIkioHANFIegJXLtqixVrZnUWzRCN5gURghv0G9pAVooPyAs
|
||||
# yzg7GfiPQdDf4MK+9uELA0yPZ23ZZTdYxbuaANHCqKnpcZ5ikZsuxak85KiVYOtu
|
||||
# T09ckT0Nf20qGM063ZRi3IbkT/k6OpwgO37lr386GqoFBmfKwXWycwxOPqk/VBZC
|
||||
# aCsViePV7elq6z5utgEK+slrPS5sdgheVB/uJh27Y5zt4134VoHSNHxgbCZA
|
||||
# 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
|
36
README.md
36
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://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
|
||||
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
|
||||
for Windows 8 and Windows 10), it only does so after actively forcing users to jump through a lot of unwarranted hoops,
|
||||
that create an exceedingly counterproductive, if not downright unfriendly, consumer experience and that greatly detract
|
||||
from what people really want (direct access to ISO downloads).
|
||||
for Windows 8 through Windows 11), up until recent releases, most of these links were only available after forcing users
|
||||
to jump through a lot of unwarranted hoops that created an exceedingly counterproductive, if not downright unfriendly,
|
||||
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
|
||||
Microsoft's own Media Creation Tool (MCT), this is because using official retail ISOs is currently the only way to
|
||||
@@ -42,26 +42,21 @@ License
|
||||
How it works
|
||||
------------
|
||||
|
||||
The script basically performs the same operation as one might perform when visiting either of the following URLs (that
|
||||
is, provided that you have also changed your `User-Agent` browser string, since, when they detect that you are using a
|
||||
version of Windows that is the same as the one you are trying to download, the Microsoft web servers at these addresses
|
||||
redirect you __away__ from the pages that allow you to download retail ISOs):
|
||||
The script basically performs the same operation as one might perform when visiting the following URL (that is, in the
|
||||
case of Windows 10, provided that you have also changed your `User-Agent` browser string, since, the Microsoft web
|
||||
servers detect that you are using a version of Windows that is the same as the one you are trying to download, they
|
||||
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
|
||||
|
||||
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
|
||||
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
|
||||
------------
|
||||
|
||||
PowerShell 3.0 or later is required. However the script should detect if you are using an older version and point you to
|
||||
the relevant PowerShell 3.0 download page if needed (which should only ever occur if you are running a vanilla version
|
||||
of Windows 7).
|
||||
|
||||
Note that the current version of the script does not need Internet Explorer to be installed and should also work with
|
||||
PowerShell 7.
|
||||
Windows 8 or later with PowerShell. Windows 7 is __not__ supported.
|
||||
|
||||
Commandline mode
|
||||
----------------
|
||||
@@ -69,6 +64,9 @@ Commandline mode
|
||||
Fido supports commandline mode whereas, whenever one of the following options is provided, a GUI is not instantiated
|
||||
and you can instead generate the ISO download from within a PowerShell console or script.
|
||||
|
||||
Note however that, as of 2023.05, Microsoft has removed access to older releases of Windows ISOs and as a result, the
|
||||
list of releases that can be downloaded from Fido has had to be reduced to only the latest for each version.
|
||||
|
||||
The options are:
|
||||
- `Win`: Specify Windows version (e.g. _"Windows 10"_). Abbreviated version should work as well (e.g `-Win 10`) as long
|
||||
as it is unique enough. If this option isn't specified, the most recent version of Windows is automatically selected.
|
||||
@@ -126,7 +124,7 @@ Additional Notes
|
||||
|
||||
Because of its intended usage with Rufus, this script is not designed to cover every possible retail ISO downloads.
|
||||
Instead we mostly chose the ones that the general public is likely to request. For instance, we currently have no plan
|
||||
to add support for LTSB/LTSC Windows 10 ISOs downloads.
|
||||
to add support for LTSB/LTSC Windows ISOs downloads.
|
||||
|
||||
If you are interested in such downloads, then you are kindly invited to visit the relevant download pages from Microsoft
|
||||
such as [this one](https://www.microsoft.com/evalcenter/evaluate-windows-10-enterprise) for LTSC versions.
|
||||
|
2
sign.sh
2
sign.sh
@@ -21,7 +21,7 @@ sign_file() {
|
||||
}
|
||||
|
||||
# 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
|
||||
echo
|
||||
# Confirm that the pass phrase is valid by trying to sign a dummy file
|
||||
|
Reference in New Issue
Block a user