Compare commits

..

11 Commits
v1.12 ... v1.18

Author SHA1 Message Date
Pete Batard
ee0393cb74 Update version and copyright year 2021-01-30 02:55:42 +00:00
isos4all
a8abb94a16 Add Windows 10 20H2 19042.631 builds
* Microsoft updated 20H2 in December. Make sure we enable those downloads too.
* Closes #21
2021-01-30 02:53:59 +00:00
Pete Batard
15a48fe24f Fix script failure with PowerShell 7.x
* Won't help though, since Microsoft forcibly removed the ability to
  parse HTML in newer PowerShell, which we need...
* Also fix session variable not being set.
* Closes #19
2020-11-16 17:26:11 +00:00
Pete Batard
e0c1015ade Add Windows 10 20H2 19042.508 builds 2020-10-21 14:58:08 +01:00
Pete Batard
46c399ecd7 Add Windows 10 20H1 19041.264 builds
* Also enable going back on error
2020-05-27 22:13:51 +01:00
Pete Batard
445ca5c074 Merge pull request #13 from pbatard/whitesource/configure
Configure WhiteSource Bolt for GitHub
2020-04-14 18:09:08 +01:00
whitesource-bolt-for-github[bot]
037cd1ad9b Add .whitesource configuration file 2020-04-14 17:08:12 +00:00
Pete Batard
aa378cad13 Fix handling of ' ' in product name
* Some locales (e.g. Russian) will return something like "Windows 10"
  for the product name which threw our JSON conversion off
* Also fix a typo
* Closes #12
2019-11-23 21:52:04 +00:00
Pete Batard
3c4fafa207 Add Windows 10 19H2 18363.418 builds 2019-11-12 22:57:50 +00:00
Pete Batard
a405ebf79c Add Windows 10 19H1 18362.356 builds
* Since Microsoft now appears to do "refreshes" of refresh versions...
* This is *NOT* 19H2, which has not been officially released as an ISO yet.
2019-10-30 12:39:56 +00:00
Pete Batard
b0599d7a94 Update Readme
* Fix typos, improve style, etc.
2019-07-14 00:04:12 +01:00
3 changed files with 101 additions and 53 deletions

8
.whitesource Normal file
View File

@@ -0,0 +1,8 @@
{
"checkRunSettings": {
"vulnerableCheckRunConclusionLevel": "failure"
},
"issueSettings": {
"minSeverityLevel": "LOW"
}
}

View File

@@ -1,6 +1,6 @@
#
# Fido v1.11 - Retail Windows ISO Downloader
# Copyright © 2019 Pete Batard <pete@akeo.ie>
# Fido v1.18 - Retail Windows ISO Downloader
# Copyright © 2019-2021 Pete Batard <pete@akeo.ie>
# ConvertTo-ImageSource: Copyright © 2016 Chris Carter
#
# This program is free software: you can redistribute it and/or modify
@@ -63,7 +63,11 @@ $code = @"
}
"@
Add-Type -MemberDefinition $code -Namespace Gui -UsingNamespace "System.IO", "System.Text", "System.Drawing", "System.Globalization" -ReferencedAssemblies System.Drawing -Name Utils -ErrorAction Stop
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
} 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 -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
@@ -75,6 +79,36 @@ $ko = 0x20000
$WindowsVersions = @(
@(
@("Windows 10", "Windows10ISO"),
@(
"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),
@@ -198,10 +232,10 @@ function Select-Language([string]$LangName)
($SysLocale.StartsWith("da") -and $LangName -like "*Danish*") -or `
($SysLocale.StartsWith("nl") -and $LangName -like "*Dutch*") -or `
($SysLocale -eq "en-US" -and $LangName -eq "English") -or `
($SysLocale.StartsWith("en") -and $LangName -like "*English*" -and $LangName -like "*inter*") -or `
($SysLocale.StartsWith("en") -and $LangName -like "*English*" -and ($LangName -like "*inter*" -or $LangName -like "*ingdom*")) -or `
($SysLocale.StartsWith("et") -and $LangName -like "*Eston*") -or `
($SysLocale.StartsWith("fi") -and $LangName -like "*Finn*") -or `
($SysLocale -eq "fr-CA" -and $LangName -like "*French*" -and $LangName -like "*Canad*") -or `
($SysLocale -eq "fr-CA" -and $LangName -like "*French*" -and $LangName -like "*Canad*") -or `
($SysLocale.StartsWith("fr") -and $LangName -eq "French") -or `
($SysLocale.StartsWith("de") -and $LangName -like "*German*") -or `
($SysLocale.StartsWith("el") -and $LangName -like "*Greek*") -or `
@@ -373,12 +407,9 @@ function Error([string]$ErrorMessage)
Write-Host Error: $ErrorMessage
$XMLForm.Title = $(Get-Translation("Error")) + ": " + $ErrorMessage
Refresh-Control($XMLForm)
$Continue.Content = Get-Translation("Close")
Refresh-Control($Continue)
$XMLGrid.Children[2 * $script:Stage + 1].IsEnabled = $True
$UserInput = [System.Windows.MessageBox]::Show($XMLForm.Title, $(Get-Translation("Error")), "OK", "Error")
$script:ExitCode = $Stage
$script:Stage = -1
$Continue.IsEnabled = $True
$script:ExitCode = $script:Stage--
}
function Get-RandomDate()
@@ -496,11 +527,7 @@ $WindowsVersion.DisplayMemberPath = "Version"
# Button Action
$Continue.add_click({
if ($script:Stage++ -lt 0) {
Get-Process -Id $pid | Foreach-Object { $_.CloseMainWindow() | Out-Null }
return
}
$script:Stage++
$XMLGrid.Children[2 * $Stage + 1].IsEnabled = $False
$Continue.IsEnabled = $False
$Back.IsEnabled = $False
@@ -565,10 +592,14 @@ $Continue.add_click({
$i = 0
$SelectedIndex = 0
try {
$r = Invoke-WebRequest -UserAgent $UserAgent -WebSession $Session $url
$r = Invoke-WebRequest -UserAgent $UserAgent -SessionVariable "Session" $url
# Go through an XML conversion to keep all PowerShells happy...
if (-not $($r.AllElements | ? {$_.id -eq "product-languages"})) {
throw "Unexpected server response"
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")
@@ -590,7 +621,7 @@ $Continue.add_click({
}
} catch {
Error($_.Exception.Message)
return
break
}
$script:Language = Add-Entry $Stage "Language" $array "DisplayLanguage"
$Language.SelectedIndex = $SelectedIndex
@@ -625,6 +656,7 @@ $Continue.add_click({
$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 = "<inputs>" + $html + "</inputs>"
@@ -640,11 +672,11 @@ $Continue.add_click({
}
}
if ($array.Length -eq 0) {
Throw-Error -Req $r -Alt "Could not retreive ISO download links"
Throw-Error -Req $r -Alt "Could not retrieve ISO download links"
}
} catch {
Error($_.Exception.Message)
return
break
}
$script:Arch = Add-Entry $Stage "Architecture" $array "Type"
@@ -681,7 +713,7 @@ $Continue.add_click({
}
$Continue.IsEnabled = $True
if ($Stage -ge 0) {
$Back.IsEnabled = $True;
$Back.IsEnabled = $True
}
})
@@ -705,10 +737,12 @@ $Back.add_click({
$Margin.Top -= $dh2
$Back.Margin = $Margin
$script:Stage = $Stage - 1
$XMLForm.Title = $AppTitle
if ($Stage -eq 0) {
$Back.Content = Get-Translation("Close")
} elseif ($Stage -eq 3) {
} else {
$Continue.Content = Get-Translation("Continue")
Refresh-Control($Continue)
}
}
})

View File

@@ -7,26 +7,32 @@ Fido: Full ISO Download Script (for Windows retail ISOs)
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 that automates access to the official Windows retail ISO download links.
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.
We decided to create this script because, while Microsoft does make retail ISO download links freely and publicly
available on their website (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, which greatly detracts from what people really want (direct access to ISO downloads).
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).
As to the reason one might want to download Windows __retail__ ISOs, as opposed to the ISOs that can be generated by
Microsoft's own Media Creation Tool (MCT), this is because it is only with an official retail ISO that one can assert
with complete certainty whether its content has been altered in any way or not. Indeed, retail Microsoft's ISOs are the
only ones you will be able to obtain an official SHA-1 for (from sites [such as this one](https://msdn.rg-adguard.net/public.php))
allowing you to be 100% certain that the image you are using is non corrupted and safe to use.
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
assert with absolute certainty that the OS content has not been altered. Indeed, because there only exists a single
master for each of them, Microsoft retail ISOs are the only ones you can obtain an official SHA-1 for (from MSDN, if you
have access to it, or from sites [such as this one](https://msdn.rg-adguard.net/public.php)) allowing you to be 100%
sure that the image you are using has not been corrupted and is safe to use.
This, in turn, offers assurance that the content __YOU__ are using to install your OS, and which it is indeed critical
to validate beforehand if you care about security, does matches bit for bit the one that Microsoft officially released.
This, in turn, offers assurance that the content __YOU__ are using to install your OS, which it is indeed critical to
validate beforehand if you have the slightest concern about security, does match, bit for bit, the one that Microsoft
released.
On the other hand, because no two MCT ISOs are the same (due to MCT always regenerating the ISO content on the fly)
it is impossible to get the same kind of assurance from non-retail ISOs. Hence the need to provide users with a much
easier and less restrictive way to access official retail ISOs...
On the other hand, regardless of the manner in which Microsoft's Media Creation Tool produces its content, because no
two MCT ISOs are ever the same (due to MCT always regenerating the ISO content on the fly) it is currently impossible to
validate with absolute certainty whether any ISO that was generated by the MCT is safe to use. Especially, unlike what
is the case for retail ISOs, it is impossible to tell whether an MCT ISO may have been corrupted after generation.
Hence the need to provide users with a much easier and less restrictive way to access official retail ISOs...
License
-------
@@ -45,31 +51,31 @@ redirect you __away__ from the pages that allow you to download retail ISOs):
* https://www.microsoft.com/software-download/Windows10ISO
After visiting those with a full browser (Internet Explorer, running through the `Invoke-WebRequest` PowerShell Cmdlet),
to confirm that they are accessible queries web APIs on the Microsoft servers to first request the language selection
available for the for the version of Windows that was selected, and then the download links for the various architecture
enabled for that version + language combination.
to confirm that they are accessible, the script then queries the web API from the Microsoft servers to first request the
language selection available for the version of Windows selected by the user, and then request the actual download links
for all the architectures available for that specific combination of version + language.
Requirements
------------
PowerShell 3.0 or later is required. But the script does detect if you are using an older version and points you to the
relevant PowerShell 3.0 download page if needed, which should only be the case if you are running a vanilla version of
Windows 7.
PowerShell 3.0 or later is required. However the script will 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 used behind the scenes, if you haven't gone through the first time setup for
Internet Explorer, you may receive an error about it when running the script. If that is the case, then you need to
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 that, if running this script elevated, this annoyance can be avoided by using the `-DisableFirstRunCustomize`
option (which basically __temporarily__ creates the key of the same name in the registry __if__ it doesn't already
exist, to bypass that behaviour).
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.
Additional Notes
----------------
Because of it's intended usage with Rufus, this script is not designed to cover all possible retail ISO downloads, but
mostly those that the general public are likely to use. For instance, we currently have no plan to add support for
LTSB/LTSC Windows 10 ISOs downloads.
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.
If you are interested in such downloads, you are kindly invited to visit the relevant download pages from Microsoft
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.