$isoPath = "C:\temp\Win10_1909.iso" $isoDirectory = Split-Path $isoPath $minimumSpace = 15 $availableSpace = (Get-Volume C).SizeRemaining / 1GB $ProgressPreference = 'SilentlyContinue' if (-not (Test-Path $isoDirectory)) { New-Item -Path $isoDirectory -ItemType directory -Force } if (Test-Path $isoPath) { Remove-Item -Path $isoPath -Force } if (-not (Test-Path $isoPath) -and $availableSpace -gt $minimumSpace) { #win10 base download code modified from FIDO: https://raw.githubusercontent.com/pbatard/Fido/master/Fido.ps1 #base variables $SessionId = [guid]::NewGuid() $RequestData = @{} $RequestData["GetLangs"] = @("a8f8f489-4c7f-463a-9ca6-5cff94d8d041", "getskuinformationbyproductedition" ) $RequestData["GetLinks"] = @("cfa9e580-a81e-4a4b-a846-7b21bf4e2e5b", "GetProductDownloadLinksBySku" ) $FirefoxVersion = Get-Random -Minimum 47 -Maximum 60 [DateTime]$Min = "1/1/2012" [DateTime]$Max = [DateTime]::Now $RandomGen = new-object random $RandomTicks = [Convert]::ToInt64( ($Max.ticks * 1.0 - $Min.Ticks * 1.0 ) * $RandomGen.NextDouble() + $Min.Ticks * 1.0 ) $Date = new-object DateTime($RandomTicks) $FirefoxDate = $Date.ToString("yyyyMMdd") $UserAgent = "Mozilla/5.0 (X11; Linux i586; rv:$FirefoxVersion.0) Gecko/$FirefoxDate Firefox/$FirefoxVersion.0" $url = "https://www.microsoft.com/en-US/api/controls/contentinclude/html" $url += "?pageId=" + $RequestData["GetLangs"][0] $url += "&host=www.microsoft.com" $url += "&segments=software-download,Windows10ISO" $url += "&query=&action=" + $RequestData["GetLangs"][1] $url += "&sessionId=" + $SessionId $url += "&productEditionId=1214" $url += "&sdVersion=2" $r = Invoke-WebRequest -UserAgent $UserAgent -WebSession $Session $url $url = "https://www.microsoft.com/en-US/api/controls/contentinclude/html" $url += "?pageId=" + $RequestData["GetLinks"][0] $url += "&host=www.microsoft.com" $url += "&segments=software-download,Windows10ISO" $url += "&query=&action=" + $RequestData["GetLinks"][1] $url += "&sessionId=" + $SessionId $url += "&skuId=8143" #english x64 sku id $url += "&language=English" $url += "&sdVersion=2" $r = Invoke-WebRequest -UserAgent $UserAgent -WebSession $Session $url $i = 0 $SelectedIndex = 0 $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 # 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("IsoX86", """x86""") $html = $html.Replace("IsoX64", """x64""") $html = "" + $html + "" $xml = [xml]$html foreach ($var in $xml.inputs.input) { $json = $var.value | ConvertFrom-Json; if ($json) { $SelectedIndex = $i $array += @(New-Object PsObject -Property @{ Type = $json.DownloadType; Link = $json.Uri }) $i++ } } if ($array.Length -eq 0) { Throw-Error -Req $r -Alt "Could not retrieve ISO download links" } } catch { Write-Output $_.Exception.Message return } $isoLink = $array | Where-Object {$_.Type -eq 'x64'} | Select -ExpandProperty Link #extract only the x64 download link Write-Output "Downloading ISO from $isoLink" Invoke-WebRequest -UserAgent $UserAgent -WebSession $Session -Uri $isoLink -OutFile $isoPath #initiate the download }