Compare commits

...

3 Commits
v1.18 ... v1.19

Author SHA1 Message Date
Pete Batard
99f6f246b8 Add Windows 10 21H1 19043.985 builds
* https://support.microsoft.com/en-us/topic/windows-10-update-history-1b6aac92-bf01-42b5-b158-f80c6d93eb11
2021-05-22 17:34:07 +01:00
Pete Batard
36e9b4420c Remove DisableFirstRunCustomize related options
* No longer needed, since we are not invoking IE behind the scenes any more.
* Also update "fake" Firefox version range.
2021-05-22 13:35:51 +01:00
Pete Batard
6d630f83f2 Switch to basic parsing everywhere and perform our own DOM handling
* Addresses #19
* Also fix PowerShell 7.1.3 warnings
2021-05-13 14:10:12 +01:00
2 changed files with 21 additions and 54 deletions

View File

@@ -1,5 +1,5 @@
#
# Fido v1.18 - Retail Windows ISO Downloader
# Fido v1.19 - Retail Windows ISO Downloader
# Copyright © 2019-2021 Pete Batard <pete@akeo.ie>
# ConvertTo-ImageSource: Copyright © 2016 Chris Carter
#
@@ -30,11 +30,7 @@ param(
[string]$Icon,
# (Optional) Name of a pipe the download URL should be sent to.
# If not provided, a browser window is opened instead.
[string]$PipeName,
# (Optional) Disable IE First Run Customize so that Invoke-WebRequest
# doesn't throw an exception if the user has never launched IE.
# Note that this requires the script to run elevated.
[switch]$DisableFirstRunCustomize
[string]$PipeName
)
#endregion
@@ -64,7 +60,7 @@ $code = @"
"@
if ($host.version -ge "7.0") {
Add-Type -MemberDefinition $code -Namespace Gui -UsingNamespace System.Runtime, System.IO, System.Text, System.Drawing, System.Globalization -ReferencedAssemblies System.Drawing.Common -Name Utils -ErrorAction Stop
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
} else {
Add-Type -MemberDefinition $code -Namespace Gui -UsingNamespace System.IO, System.Text, System.Drawing, System.Globalization -ReferencedAssemblies System.Drawing -Name Utils -ErrorAction Stop
}
@@ -79,6 +75,12 @@ $ko = 0x20000
$WindowsVersions = @(
@(
@("Windows 10", "Windows10ISO"),
@(
"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),
@@ -447,14 +449,11 @@ $MaxStage = 4
$SessionId = [guid]::NewGuid()
$ExitCode = 100
$Locale = "en-US"
$DFRCKey = "HKLM:\Software\Policies\Microsoft\Internet Explorer\Main\"
$DFRCName = "DisableFirstRunCustomize"
$DFRCAdded = $False
$RequestData = @{}
$RequestData["GetLangs"] = @("a8f8f489-4c7f-463a-9ca6-5cff94d8d041", "getskuinformationbyproductedition" )
$RequestData["GetLinks"] = @("cfa9e580-a81e-4a4b-a846-7b21bf4e2e5b", "GetProductDownloadLinksBySku" )
# Create a semi-random Linux User-Agent string
$FirefoxVersion = Get-Random -Minimum 30 -Maximum 60
$FirefoxVersion = Get-Random -Minimum 50 -Maximum 90
$FirefoxDate = Get-RandomDate
$UserAgent = "Mozilla/5.0 (X11; Linux i586; rv:$FirefoxVersion.0) Gecko/$FirefoxDate Firefox/$FirefoxVersion.0"
#endregion
@@ -485,20 +484,6 @@ if ($PSVersionTable.PSVersion.Major -lt 3) {
exit 102
}
# If asked, disable IE's first run customize prompt as it interferes with Invoke-WebRequest
if ($DisableFirstRunCustomize) {
try {
# Only create the key if it doesn't already exist
Get-ItemProperty -Path $DFRCKey -Name $DFRCName
} catch {
if (-not (Test-Path $DFRCKey)) {
New-Item -Path $DFRCKey -Force | Out-Null
}
Set-ItemProperty -Path $DFRCKey -Name $DFRCName -Value 1
$DFRCAdded = $True
}
}
# Form creation
$XMLForm = [Windows.Markup.XamlReader]::Load((New-Object System.Xml.XmlNodeReader $XAML))
$XAML.SelectNodes("//*[@Name]") | ForEach-Object { Set-Variable -Name ($_.Name) -Value $XMLForm.FindName($_.Name) -Scope Script }
@@ -592,18 +577,11 @@ $Continue.add_click({
$i = 0
$SelectedIndex = 0
try {
$r = Invoke-WebRequest -UserAgent $UserAgent -SessionVariable "Session" $url
$r = Invoke-WebRequest -UseBasicParsing -UserAgent $UserAgent -SessionVariable "Session" $url
$pattern = '(?s)<select id="product-languages">(.*)?</select>'
$html = [regex]::Match($r, $pattern).Groups[1].Value
# Go through an XML conversion to keep all PowerShells happy...
if (-not $($r.AllElements | ? {$_.id -eq "product-languages"})) {
if ($host.version -ge "7.0") {
throw "This PowerShell version can not parse HTML"
} else {
throw "Unexpected server response"
}
}
$html = $($r.AllElements | ? {$_.id -eq "product-languages"}).InnerHTML
$html = $html.Replace("selected value", "value")
$html = $html.Replace("&", "&amp;")
$html = "<options>" + $html + "</options>"
$xml = [xml]$html
foreach ($var in $xml.options.option) {
@@ -647,18 +625,15 @@ $Continue.add_click({
$array = @()
try {
$Is64 = [Environment]::Is64BitOperatingSystem
$r = Invoke-WebRequest -UserAgent $UserAgent -WebSession $Session $url
if (-not $($r.AllElements | ? {$_.id -eq "expiration-time"})) {
Throw-Error -Req $r -Alt Get-Translation($English[14])
}
$html = $($r.AllElements | ? {$_.tagname -eq "input"}).outerHTML
$r = Invoke-WebRequest -UseBasicParsing -UserAgent $UserAgent -WebSession $Session $url
$pattern = '(?s)(<input.*?/>)'
ForEach-Object { [regex]::Matches($r, $pattern) } | ForEach-Object { $html += $_.Groups[1].value }
# Need to fix the HTML and JSON data so that it is well-formed
$html = $html.Replace("class=product-download-hidden", "")
$html = $html.Replace("type=hidden", "")
$html = $html.Replace(">", "/>")
$html = $html.Replace("&nbsp;", " ")
$html = $html.Replace("IsoX86", """x86""")
$html = $html.Replace("IsoX64", """x64""")
$html = $html.Replace("IsoX86", "&quot;x86&quot;")
$html = $html.Replace("IsoX64", "&quot;x64&quot;")
$html = "<inputs>" + $html + "</inputs>"
$xml = [xml]$html
foreach ($var in $xml.inputs.input) {
@@ -752,7 +727,4 @@ $XMLForm.Add_Loaded( { $XMLForm.Activate() } )
$XMLForm.ShowDialog() | Out-Null
# Clean up & exit
if ($DFRCAdded) {
Remove-ItemProperty -Path $DFRCKey -Name $DFRCName
}
exit $ExitCode

View File

@@ -58,17 +58,12 @@ for all the architectures available for that specific combination of version + l
Requirements
------------
PowerShell 3.0 or later is required. However the script will detect if you are using an older version and point you to
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).
Also, because Internet Explorer is being invoked behind the scenes, if you haven't gone through the first time setup for
Internet Explorer, you may receive an error about this when running the script. If that is the case, then you should
make sure that you manually launch IE at least once and complete the setup.
Note however that, if you are running the script elevated, you can work around the above annoyance by using the
`-DisableFirstRunCustomize` option which basically __temporarily__ creates a key of the same name in the registry __if__
it doesn't already exist, to bypass the first time setup error.
Note that the current version of the script does not need Internet Explorer to be installed and should also work with
PowerShell 7.
Additional Notes
----------------