mirror of
https://github.com/pbatard/Fido.git
synced 2025-09-17 06:38:03 +02:00
Compare commits
3 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
4b24ae5795 | ||
![]() |
2ca0f62f53 | ||
![]() |
448cfa72cf |
108
Fido.ps1
108
Fido.ps1
@@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# Fido v1.41 - 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-2023 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
|
||||||
@@ -60,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)]
|
||||||
@@ -618,29 +626,24 @@ 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|Download of Windows ISOs is unavailable due to Microsoft having altered their website to prevent 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?"
|
"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)
|
||||||
{
|
{
|
||||||
@@ -740,7 +743,7 @@ function Get-Windows-Languages([int]$SelectedVersion, [int]$SelectedEdition)
|
|||||||
Throw-Error -Req $r -Alt "Could not retrieve languages from server"
|
Throw-Error -Req $r -Alt "Could not retrieve languages from server"
|
||||||
}
|
}
|
||||||
$r = $r -replace "`n" -replace "`r"
|
$r = $r -replace "`n" -replace "`r"
|
||||||
$pattern = '.*<select id="product-languages"[^>]+>(.*)</select>.*'
|
$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")
|
||||||
@@ -825,16 +828,7 @@ function Get-Windows-Download-Links([int]$SelectedVersion, [int]$SelectedRelease
|
|||||||
$Is64 = [Environment]::Is64BitOperatingSystem
|
$Is64 = [Environment]::Is64BitOperatingSystem
|
||||||
# Must add a referer for this request, else Microsoft's servers will deny it
|
# Must add a referer for this request, else Microsoft's servers will deny it
|
||||||
$ref = "https://www.microsoft.com/software-download/windows11"
|
$ref = "https://www.microsoft.com/software-download/windows11"
|
||||||
$wr = [System.Net.WebRequest]::Create($url)
|
$r = Invoke-WebRequest -Method Post -Headers @{ "Referer" = $ref } -UseBasicParsing -UserAgent $UserAgent -WebSession $Session $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()
|
|
||||||
if ($r -match "errorModalMessage") {
|
if ($r -match "errorModalMessage") {
|
||||||
$regex = New-Object Text.RegularExpressions.Regex '<p id="errorModalMessage">(.+?)<\/p>'
|
$regex = New-Object Text.RegularExpressions.Regex '<p id="errorModalMessage">(.+?)<\/p>'
|
||||||
$m = $regex.Match($r)
|
$m = $regex.Match($r)
|
||||||
@@ -916,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") {
|
||||||
@@ -1083,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 = @()
|
||||||
@@ -1212,8 +1218,8 @@ exit $ExitCode
|
|||||||
# SIG # Begin signature block
|
# SIG # Begin signature block
|
||||||
# MIIkWAYJKoZIhvcNAQcCoIIkSTCCJEUCAQExDzANBglghkgBZQMEAgEFADB5Bgor
|
# MIIkWAYJKoZIhvcNAQcCoIIkSTCCJEUCAQExDzANBglghkgBZQMEAgEFADB5Bgor
|
||||||
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
|
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
|
||||||
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCCyA1DxwYegKJ2C
|
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCDa8PrIe1NSjXqW
|
||||||
# H681zwD4uu1/m7nOUczTmgbYeIwE0KCCElkwggVvMIIEV6ADAgECAhBI/JO0YFWU
|
# rwtj7a1ha0/FMIwXSDFruNwgp2G8haCCElkwggVvMIIEV6ADAgECAhBI/JO0YFWU
|
||||||
# jTanyYqJ1pQWMA0GCSqGSIb3DQEBDAUAMHsxCzAJBgNVBAYTAkdCMRswGQYDVQQI
|
# jTanyYqJ1pQWMA0GCSqGSIb3DQEBDAUAMHsxCzAJBgNVBAYTAkdCMRswGQYDVQQI
|
||||||
# DBJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoM
|
# DBJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoM
|
||||||
# EUNvbW9kbyBDQSBMaW1pdGVkMSEwHwYDVQQDDBhBQUEgQ2VydGlmaWNhdGUgU2Vy
|
# EUNvbW9kbyBDQSBMaW1pdGVkMSEwHwYDVQQDDBhBQUEgQ2VydGlmaWNhdGUgU2Vy
|
||||||
@@ -1316,22 +1322,22 @@ exit $ExitCode
|
|||||||
# aWMgQ29kZSBTaWduaW5nIENBIEVWIFIzNgIRAL+xUAG79ZLUlip3l+pzb6MwDQYJ
|
# aWMgQ29kZSBTaWduaW5nIENBIEVWIFIzNgIRAL+xUAG79ZLUlip3l+pzb6MwDQYJ
|
||||||
# YIZIAWUDBAIBBQCgfDAQBgorBgEEAYI3AgEMMQIwADAZBgkqhkiG9w0BCQMxDAYK
|
# YIZIAWUDBAIBBQCgfDAQBgorBgEEAYI3AgEMMQIwADAZBgkqhkiG9w0BCQMxDAYK
|
||||||
# KwYBBAGCNwIBBDAcBgorBgEEAYI3AgELMQ4wDAYKKwYBBAGCNwIBFTAvBgkqhkiG
|
# KwYBBAGCNwIBBDAcBgorBgEEAYI3AgELMQ4wDAYKKwYBBAGCNwIBFTAvBgkqhkiG
|
||||||
# 9w0BCQQxIgQghkV9wFJU06Go0jd7fPagSzeond1V7DBGYEmyXshGMdwwDQYJKoZI
|
# 9w0BCQQxIgQgZt1L7FY2zlXGm+elfLNq4whr0tPpkCErcZFwHcLK42kwDQYJKoZI
|
||||||
# hvcNAQEBBQAEggIAQiY9/49uWjGdiy2Jmf1YPRLj7F87IHrQOcTHcEuhhZmszJQ4
|
# hvcNAQEBBQAEggIAO7AqJKab0cMvAjNl+zVgKFQ9/8RSM1+6u9cJGz3boyIc8XHK
|
||||||
# x1624ArYVWIz0FJgqp5fq3jts04jV+rkzxaGIHt+C/R04VPXlE0+Ly/QfB5ewvZG
|
# YnKrhVIelU4+iwcD+KIHfZK9R5p30PhKB34QpxarEQ1g7VBc+BMKwaFPcke/gPr6
|
||||||
# YPKcl9jCGUisJkXv9SkqZDh26CaJLceqUT6CiOLIP0ZdKuZAEXQEaXhaXoeiIJIO
|
# hgIJZbvUogqVA9/evJjX1ulwyh5CSUosIYZUyXdV7t75PlbQ04ndzXtd1LUjPKp+
|
||||||
# nYXc+5u+RpuKDs9Hft3vM9Pu06wCFv+RfyoiCzx5cmoO3GaxPff1ywLQ9DWb2Squ
|
# EGSOzObzpTzfrKKAH0T9IFafp5wV+w3Nt1KhT8UmpLEGuh0QURLp4YhYy/KmWo+2
|
||||||
# BdZDKubYWamlu3tjeJu9YjeQvhOED0HZphRPvozmLNJ1v7tN0JNZaE/WkqKPsK+p
|
# wHeZsro7r1vS9J7099kD8+p1KnlgY63t2M3fY+5X7fPZ8jwGbFeEh0WyyzhNlqUd
|
||||||
# NPT1T3S9lzqRTePNkhngoWwbMlW1RVLUSZnYtAsjEJ3ACobIIRxnymLP5OYmJXtT
|
# Ut8F931EnwnXXA+Re1FRNFd00JjdpmFQpqkQHY5HKh6FAbAxBmOGM5Zv3mpmkVjS
|
||||||
# pN6XV9YjdygreM0F0Q7+qJBgMNPNLMgiTkKhNwVDBwLl5dxqpeR9K1AbOrd3LnWN
|
# 9VVoX3RaQMoXGduYIF8RnfKN6DV8OKc0V1D9NOPJcK/XZur6vow5Htpikj2Dyrdm
|
||||||
# /84PWAcUDsZZ3CMSzfUKX+M+X1COBbedCxcuoj1Kmtw7zKXZbxQ9e4rUO3PkpQxg
|
# kvMiK+sqkDGsqhIdiAYHfa8Pq2bMfB/AQs4kcF3gkBaRwZQSLr9blWF6H5mL01Qq
|
||||||
# G8MySj+GxBxvkwZMR9f5fgbL8jaauv9ZYW2auWMoAHLeosc/hOSjCikZdpc0/5Pb
|
# YwCE3umpacP/P48PEDQ2kL4QYTvkIY8YL6Y81TXGfOxBj/EwQNalyaytln5+I7/0
|
||||||
# KejGN+G52p2bZsiG0oYI5g3wdMgK0/jzDtmtRk7vBOwFVcPajWk9dJVcZUWSO4Fx
|
# nn1/nfriVU91cFvf1CYaId4xWqCTboC/49KtSN1cUMZsHFZggoPk5wNJZ/UIEAd3
|
||||||
# NzWrgh6Zd3Nw8bESEkoVKl9sZ3BmZDMAIRMJeh9df88fdGMpphHSvax9iqmhgg48
|
# 2K7NiWxbUQA3wDiNrymEgts3lg3zV5DWGgYosWottpzYfWBcZqiI/65JT42hgg48
|
||||||
# MIIOOAYKKwYBBAGCNwMDATGCDigwgg4kBgkqhkiG9w0BBwKggg4VMIIOEQIBAzEN
|
# MIIOOAYKKwYBBAGCNwMDATGCDigwgg4kBgkqhkiG9w0BBwKggg4VMIIOEQIBAzEN
|
||||||
# MAsGCWCGSAFlAwQCATCCAQ4GCyqGSIb3DQEJEAEEoIH+BIH7MIH4AgEBBgtghkgB
|
# MAsGCWCGSAFlAwQCATCCAQ4GCyqGSIb3DQEJEAEEoIH+BIH7MIH4AgEBBgtghkgB
|
||||||
# hvhFAQcXAzAxMA0GCWCGSAFlAwQCAQUABCAuqPrJeyIXyKT4PoyMHW9VPNUbPdyd
|
# hvhFAQcXAzAxMA0GCWCGSAFlAwQCAQUABCBgeYfVPt15f69ZGlb0XMap8ogxbbm0
|
||||||
# 9x3e4MJmUjHYAgIUe0QNbKQftlVLV412+ojSFQPpR8UYDzIwMjMwMTI1MjAwMTEw
|
# dx/FX6105nFxYQIUUU2TzURLgm2l56wAV0nbgxAYczMYDzIwMjMwMTI3MTUxMTUy
|
||||||
# WjADAgEeoIGGpIGDMIGAMQswCQYDVQQGEwJVUzEdMBsGA1UEChMUU3ltYW50ZWMg
|
# WjADAgEeoIGGpIGDMIGAMQswCQYDVQQGEwJVUzEdMBsGA1UEChMUU3ltYW50ZWMg
|
||||||
# Q29ycG9yYXRpb24xHzAdBgNVBAsTFlN5bWFudGVjIFRydXN0IE5ldHdvcmsxMTAv
|
# Q29ycG9yYXRpb24xHzAdBgNVBAsTFlN5bWFudGVjIFRydXN0IE5ldHdvcmsxMTAv
|
||||||
# BgNVBAMTKFN5bWFudGVjIFNIQTI1NiBUaW1lU3RhbXBpbmcgU2lnbmVyIC0gRzOg
|
# BgNVBAMTKFN5bWFudGVjIFNIQTI1NiBUaW1lU3RhbXBpbmcgU2lnbmVyIC0gRzOg
|
||||||
@@ -1395,13 +1401,13 @@ exit $ExitCode
|
|||||||
# A1UEChMUU3ltYW50ZWMgQ29ycG9yYXRpb24xHzAdBgNVBAsTFlN5bWFudGVjIFRy
|
# A1UEChMUU3ltYW50ZWMgQ29ycG9yYXRpb24xHzAdBgNVBAsTFlN5bWFudGVjIFRy
|
||||||
# dXN0IE5ldHdvcmsxKDAmBgNVBAMTH1N5bWFudGVjIFNIQTI1NiBUaW1lU3RhbXBp
|
# dXN0IE5ldHdvcmsxKDAmBgNVBAMTH1N5bWFudGVjIFNIQTI1NiBUaW1lU3RhbXBp
|
||||||
# bmcgQ0ECEHvU5a+6zAc/oQEjBCJBTRIwCwYJYIZIAWUDBAIBoIGkMBoGCSqGSIb3
|
# bmcgQ0ECEHvU5a+6zAc/oQEjBCJBTRIwCwYJYIZIAWUDBAIBoIGkMBoGCSqGSIb3
|
||||||
# DQEJAzENBgsqhkiG9w0BCRABBDAcBgkqhkiG9w0BCQUxDxcNMjMwMTI1MjAwMTEw
|
# DQEJAzENBgsqhkiG9w0BCRABBDAcBgkqhkiG9w0BCQUxDxcNMjMwMTI3MTUxMTUy
|
||||||
# WjAvBgkqhkiG9w0BCQQxIgQgc3vhzrShNhu9c86BzACvzjsyq6mGfUC5lnjnmheR
|
# WjAvBgkqhkiG9w0BCQQxIgQgeeqIeo9Kcp71ZTFGCM4j8vvANl2gqXHGZO7PVGZz
|
||||||
# lXQwNwYLKoZIhvcNAQkQAi8xKDAmMCQwIgQgxHTOdgB9AjlODaXk3nwUxoD54oIB
|
# 1ygwNwYLKoZIhvcNAQkQAi8xKDAmMCQwIgQgxHTOdgB9AjlODaXk3nwUxoD54oIB
|
||||||
# PP72U+9dtx/fYfgwCwYJKoZIhvcNAQEBBIIBABFl9vc68ULyXJl07hEAx9S8cbMg
|
# PP72U+9dtx/fYfgwCwYJKoZIhvcNAQEBBIIBAAx1R1UnC8znHFbV2JkK+/UklEJH
|
||||||
# 3klf7ORGPe0ttXXsQZPldKylCAqT8XuJRZMAOYrMhMvG79N8LIETXvyhgyVdGGzy
|
# 2vkucu8cyPp6TS84T5Zpf9+TYV1JLYy00bmkXFdsY4ioS+GRd+ocGpgv887bQXKw
|
||||||
# rZkVIry6HXkAuZysJ+8xu4Oshf6NFMHs1ATTg2jLWBZ8r39GrUAu1oSL+q8laQE3
|
# 7xEP4ouQ2MR2/o4wakDTy4GqzxL2awZSSJvaHLKk1H5+gkvkNcYV/vTkHgkpcUwC
|
||||||
# HvBvmWaM4Yv1/N1OdEHcgw2Zdxvy8P6g3bfNzv1SqMtf3Nn4TUv0RQZ5GJ9e8cfN
|
# Qqfh4P5unQwnCsQwOVtzgjSbrmslS5ctac66Vvjs6/0ewnTYQncnA04Us5tR/UPH
|
||||||
# W19bcP37k5QR4AIuG3ItzEAyHppFYGM2bQ+X0KtWmWGpFeRd6Zd/pauS1PD7f87q
|
# bWSajMeLGp4E1k/sWWU9V7+uiQqx1wo5Qs6AjXkEu0NpfFGgUM1Js7X4cRUpWumM
|
||||||
# d7bG1jvjgyLAuxGxF/xSN/QizrOvWnV1Eya13mELBDNtg9UhUcxzmofj4Zw=
|
# /q23yClpxUHiDHPA1nhOHLuHlgn8RZwEdTB6ZOD0JIRVp3RpZ9Q+Qlu34qc=
|
||||||
# SIG # End signature block
|
# SIG # End signature block
|
||||||
|
Reference in New Issue
Block a user