mirror of
https://github.com/msvc-win/get.msvc.win.git
synced 2025-12-14 12:17:40 +00:00
169 lines
No EOL
6.8 KiB
Text
169 lines
No EOL
6.8 KiB
Text
Add-Type -AssemblyName System.IO.Compression.FileSystem
|
|
|
|
function Main {
|
|
if ($PSVersionTable.PSEdition -ne 'Desktop' -and $env:OS -ne 'Windows_NT') {
|
|
Write-Warning "Please run it on Windows. "
|
|
return 1
|
|
}
|
|
|
|
$procArch = $Env:PROCESSOR_ARCHITECTURE
|
|
if ($procArch -eq 'ARM') {
|
|
Write-Warning "This script does not support Windows RT. Exiting..."
|
|
return 1
|
|
}
|
|
elseif ($procArch -eq 'ia64') {
|
|
Write-Warning "This script does not support Itanium. Exiting..."
|
|
return 1
|
|
}
|
|
|
|
$flagPath = "$env:TEMP\elevation_success.flag"
|
|
if (Test-Path $flagPath) { Remove-Item $flagPath -ErrorAction SilentlyContinue }
|
|
|
|
# --- Elevation check ---
|
|
$IsAdmin = ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole(
|
|
[Security.Principal.WindowsBuiltInRole]::Administrator)
|
|
|
|
if (-not $IsAdmin) {
|
|
Write-Host "Elevation required. Relaunching..."
|
|
$tempScript = [IO.Path]::ChangeExtension([IO.Path]::GetTempFileName(), ".ps1")
|
|
Invoke-WebRequest -Uri "https://get.msvc.win/dx" -OutFile $tempScript
|
|
Start-Process powershell -Verb RunAs -ArgumentList "-NoProfile -ExecutionPolicy Bypass -File `"$tempScript`""
|
|
Start-Sleep -Seconds 10
|
|
if (-Not (Test-Path $flagPath)) {
|
|
Write-Warning "User did not confirm UAC prompt or something went wrong."
|
|
return 1
|
|
}
|
|
else {
|
|
Remove-Item $flagPath -ErrorAction SilentlyContinue
|
|
Write-Host "Setup ran successfully."
|
|
return 0
|
|
}
|
|
}
|
|
|
|
# --- Elevated section ---
|
|
New-Item -Path $flagPath -ItemType File -Force | Out-Null
|
|
Write-Host "Running with elevated privileges..."
|
|
|
|
$tempDir = New-Item -ItemType Directory -Path ([IO.Path]::Combine($env:TEMP, [guid]::NewGuid().ToString()))
|
|
$aria2Dir = Join-Path $tempDir "aria2"
|
|
$aria2Exe = Join-Path $aria2Dir "aria2c.exe"
|
|
|
|
# --- Check User IP location ---
|
|
|
|
$geoInfo = Invoke-RestMethod -Uri 'https://ipapi.co/json/'
|
|
$countryCode = $geoInfo.country
|
|
|
|
# --- Check Proxy Settings ---
|
|
$webProxy = [System.Net.WebRequest]::GetSystemWebProxy()
|
|
$uri = New-Object Uri("http://example.com")
|
|
$proxyUri = $webProxy.GetProxy($uri)
|
|
|
|
$useProxy = $proxyUri.Host -ne "example.com"
|
|
if ($useProxy) {
|
|
$proxyAddress = $proxyUri.Authority
|
|
Write-Host "Detected system proxy: $proxyAddress"
|
|
}
|
|
|
|
# --- Ensure aria2c is available ---
|
|
if (-not (Test-Path $aria2Exe)) {
|
|
Write-Host "Downloading aria2c..."
|
|
$aria2Zip = Join-Path $tempDir "aria2.zip"
|
|
if ($countryCode -eq 'CN') {
|
|
$aria2Url = "https://gitee.com/HikariCalyx/OSTRemote/releases/download/v1.0/aria2-1.37.0-win-32bit-build1.zip"
|
|
# Workaround for specific Chinese ISPs that would not resolve domains properly like aka.ms
|
|
$regionalWorkaround = "--async-dns-server=223.5.5.5"
|
|
}
|
|
else {
|
|
$aria2Url = "https://github.com/aria2/aria2/releases/download/release-1.37.0/aria2-1.37.0-win-64bit-build1.zip"
|
|
$regionalWorkaround = ""
|
|
}
|
|
if ($useProxy) {
|
|
$regionalWorkaround = "--all-proxy=$proxyAddress"
|
|
}
|
|
if ($procArch -ne "AMD64") {
|
|
$aria2Url = $aria2Url.Replace("64bit", "32bit")
|
|
}
|
|
Invoke-WebRequest -Uri $aria2Url -OutFile $aria2Zip
|
|
Expand-Archive -Path $aria2Zip -DestinationPath $aria2Dir -Force
|
|
$found = Get-ChildItem -Path $aria2Dir -Recurse -Filter "aria2c.exe" | Select-Object -First 1
|
|
if ($found) { Copy-Item $found.FullName -Destination $aria2Exe -Force }
|
|
}
|
|
|
|
# --- Define all downloads ---
|
|
$downloads = @(
|
|
@{ Name = "directx_redist.exe"; Url = "https://download.microsoft.com/download/8/4/a/84a35bf1-dafe-4ae8-82af-ad2ae20b6b14/directx_jun2010_redist.exe" }
|
|
)
|
|
|
|
# --- Download everything up front ---
|
|
foreach ($item in $downloads) {
|
|
$outFile = Join-Path $tempDir $item.Name
|
|
Write-Host "Downloading $($item.Name)..."
|
|
$argumentList = @(
|
|
"--dir=`"$($outFile | Split-Path)`"",
|
|
"--out=`"$(Split-Path -Leaf $outFile)`"",
|
|
"--allow-overwrite=true",
|
|
"--retry-wait=5",
|
|
"--max-connection-per-server=8",
|
|
"--split=8",
|
|
"--min-split-size=1M",
|
|
"`"$($item.Url)`""
|
|
)
|
|
if (![string]::IsNullOrEmpty($regionalWorkaround)) {
|
|
$argumentList += $regionalWorkaround
|
|
}
|
|
$proc = Start-Process -FilePath $aria2Exe -ArgumentList $argumentList -NoNewWindow -PassThru -Wait
|
|
if ($proc.ExitCode -ne 0) {
|
|
Write-Warning "aria2c failed (exit code $($proc.ExitCode)). Retrying with --check-certificate=false..."
|
|
$argsRetry = $argumentList + "--check-certificate=false"
|
|
Start-Process -FilePath $aria2Exe -ArgumentList $argsRetry -NoNewWindow -Wait
|
|
}
|
|
}
|
|
|
|
# --- Check Signature ---
|
|
foreach ($item in $downloads) {
|
|
$outFile = Join-Path $tempDir $item.Name
|
|
Write-Host "Verifying signature of $($item.Name)..."
|
|
$signature = Get-AuthenticodeSignature $outFile
|
|
if ($signature.SignerCertificate.Subject -like "*CN=Microsoft Corporation*" -and $signature.Status -eq "Valid") {
|
|
if ($env:WT_SESSION) {
|
|
Write-Host "✅ Valid Microsoft signature found from $($item.Name)."
|
|
}
|
|
else {
|
|
Write-Host "[OKAY] Valid Microsoft signature found from $($item.Name)."
|
|
}
|
|
}
|
|
else {
|
|
if ($env:WT_SESSION) {
|
|
Write-Warning "⚠️ $($item.Name) is not signed by Microsoft. The download may get corrupted or your PC is infected with virus."
|
|
}
|
|
else {
|
|
Write-Warning "[WARN] $($item.Name) is not signed by Microsoft. The download may get corrupted or your PC is infected with virus."
|
|
}
|
|
$response = Read-Host -Prompt "Would you like to proceed anyway? (Y/N)"
|
|
if ($response -eq 'Y' -or $response -eq 'y') {
|
|
continue
|
|
}
|
|
elseif ($response -eq 'N' -or $response -eq 'n') {
|
|
return 1
|
|
}
|
|
else {
|
|
Write-Host "Invalid input. Please enter Y or N."
|
|
}
|
|
}
|
|
}
|
|
|
|
# --- Install DirectX ---
|
|
Write-Host "Installing DirectX..."
|
|
Start-Process -FilePath "$tempDir\directx_redist.exe" -ArgumentList "/Q /T:`"$tempDir`"" -Wait
|
|
Start-Process -FilePath "$tempDir\DXSETUP.exe" -ArgumentList "/silent" -Wait
|
|
|
|
# --- Cleanup ---
|
|
Write-Host "Cleaning up temporary files..."
|
|
Start-Sleep -Seconds 2
|
|
Remove-Item -Path $tempDir -Recurse -Force -ErrorAction SilentlyContinue
|
|
Remove-Item -Path $flagPath -Force -ErrorAction SilentlyContinue
|
|
}
|
|
|
|
Main
|
|
Write-Host "Press any key to exit."
|
|
$null = [System.Console]::ReadKey($true) |