mirror of
https://github.com/rbalsleyMSFT/FFU.git
synced 2026-06-14 10:19:36 -06:00
Merge branch '11-24031' of https://github.com/rbalsleyMSFT/FFU into 11-24031
This commit is contained in:
@@ -433,24 +433,126 @@ function Invoke-Process {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
function Get-ADKURL {
|
||||||
|
param (
|
||||||
|
[ValidateSet("Windows ADK", "WinPE add-on")]
|
||||||
|
[string]$ADKOption
|
||||||
|
)
|
||||||
|
|
||||||
|
# Define base pattern for URL scraping
|
||||||
|
$basePattern = '<li><a href="(https://[^"]+)" data-linktype="external">Download the '
|
||||||
|
|
||||||
|
# Define specific URL patterns based on ADK options
|
||||||
|
$ADKUrlPattern = @{
|
||||||
|
"Windows ADK" = $basePattern + "Windows ADK"
|
||||||
|
"WinPE add-on" = $basePattern + "Windows PE add-on for the Windows ADK"
|
||||||
|
}[$ADKOption]
|
||||||
|
|
||||||
|
try {
|
||||||
|
# Retrieve content of Microsoft documentation page
|
||||||
|
$ADKWebPage = Invoke-RestMethod "https://learn.microsoft.com/en-us/windows-hardware/get-started/adk-install"
|
||||||
|
|
||||||
|
# Extract download URL based on specified pattern
|
||||||
|
$ADKMatch = [regex]::Match($ADKWebPage, $ADKUrlPattern)
|
||||||
|
|
||||||
|
if (-not $ADKMatch.Success) {
|
||||||
|
WriteLog "Failed to retrieve ADK download URL. Pattern match failed."
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
# Extract FWlink from the matched pattern
|
||||||
|
$ADKFWLink = $ADKMatch.Groups[1].Value
|
||||||
|
|
||||||
|
if ($null -eq $ADKFWLink) {
|
||||||
|
WriteLog "FWLink for $ADKOption not found."
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
# Retrieve headers of the FWlink URL
|
||||||
|
$FWLinkRequest = Invoke-WebRequest -Uri $ADKFWLink -Method Head -MaximumRedirection 0 -ErrorAction SilentlyContinue
|
||||||
|
|
||||||
|
if ($FWLinkRequest.StatusCode -ne 302) {
|
||||||
|
WriteLog "Failed to retrieve ADK download URL. Unexpected status code: $($FWLinkRequest.StatusCode)"
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
# Get the ADK link redirected to by the FWlink
|
||||||
|
$ADKUrl = $FWLinkRequest.Headers.Location
|
||||||
|
return $ADKUrl
|
||||||
|
}
|
||||||
|
catch {
|
||||||
|
WriteLog $_
|
||||||
|
Write-Error "Error occurred while retrieving ADK download URL"
|
||||||
|
throw $_
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function Install-ADK {
|
||||||
|
param (
|
||||||
|
[ValidateSet("Windows ADK", "WinPE add-on")]
|
||||||
|
[string]$ADKOption
|
||||||
|
)
|
||||||
|
|
||||||
|
try {
|
||||||
|
$ADKUrl = Get-ADKURL -ADKOption $ADKOption
|
||||||
|
|
||||||
|
if ($null -eq $ADKUrl) {
|
||||||
|
throw "Failed to retrieve URL for $ADKOption. Please manually install it."
|
||||||
|
}
|
||||||
|
|
||||||
|
# Select the installer based on the ADK option specified
|
||||||
|
$installer = @{
|
||||||
|
"Windows ADK" = "adksetup.exe"
|
||||||
|
"WinPE add-on" = "adkwinpesetup.exe"
|
||||||
|
}[$ADKOption]
|
||||||
|
|
||||||
|
# Select the feature based on the ADK option specified
|
||||||
|
$feature = @{
|
||||||
|
"Windows ADK" = "OptionId.DeploymentTools"
|
||||||
|
"WinPE add-on" = "OptionId.WindowsPreinstallationEnvironment"
|
||||||
|
}[$ADKOption]
|
||||||
|
|
||||||
|
$installerLocation = Join-Path $env:TEMP $installer
|
||||||
|
|
||||||
|
WriteLog "Downloading $ADKOption from $ADKUrl to $installerLocation"
|
||||||
|
Start-BitsTransfer -Source $ADKUrl -Destination $installerLocation -ErrorAction Stop
|
||||||
|
WriteLog "$ADKOption downloaded to $installerLocation"
|
||||||
|
|
||||||
|
WriteLog "Installing $ADKOption with $feature enabled"
|
||||||
|
Invoke-Process $installerLocation "/quiet /installpath ""%ProgramFiles(x86)%\Windows Kits\10"" /features $feature"
|
||||||
|
|
||||||
|
WriteLog "$ADKOption installation completed."
|
||||||
|
WriteLog "Removing $installer from $installerLocation"
|
||||||
|
# Clean up downloaded installation file
|
||||||
|
Remove-Item -Path $installerLocation -Force -ErrorAction SilentlyContinue
|
||||||
|
}
|
||||||
|
catch {
|
||||||
|
WriteLog $_
|
||||||
|
Write-Error "Error occurred while installing $ADKOption. Please manually install it."
|
||||||
|
throw $_
|
||||||
|
}
|
||||||
|
}
|
||||||
Function Get-ADK {
|
Function Get-ADK {
|
||||||
Writelog 'Get ADK Path'
|
Writelog 'Get ADK Path'
|
||||||
# Define the registry key and value name to query
|
# Define the registry key and value name to query
|
||||||
$adkRegKey = "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows Kits\Installed Roots"
|
$adkRegKey = "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows Kits\Installed Roots"
|
||||||
$adkRegValueName = "KitsRoot10"
|
$adkRegValueName = "KitsRoot10"
|
||||||
|
|
||||||
# Check if the registry key exists
|
# Check if the registry value exists
|
||||||
if (Test-Path $adkRegKey) {
|
if ($null -ne (Get-ItemProperty -Path $adkRegKey -Name $adkRegValueName -ErrorAction SilentlyContinue)) {
|
||||||
# Get the registry value for the Windows ADK installation path
|
# Get the registry value for the Windows ADK installation path
|
||||||
$adkPath = (Get-ItemProperty -Path $adkRegKey -Name $adkRegValueName).$adkRegValueName
|
$adkPath = (Get-ItemProperty -Path $adkRegKey -Name $adkRegValueName).$adkRegValueName
|
||||||
|
|
||||||
if ($adkPath) {
|
|
||||||
WriteLog "ADK located at $adkPath"
|
WriteLog "ADK located at $adkPath"
|
||||||
return $adkPath
|
return $adkPath
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else {
|
else {
|
||||||
throw "Windows ADK is not installed or the installation path could not be found."
|
WriteLog "ADK is not installed. Installing ADK now..."
|
||||||
|
Install-ADK -ADKOption "Windows ADK"
|
||||||
|
WriteLog "Installing WinPE add-on for Windows ADK..."
|
||||||
|
Install-ADK -ADKOption "WinPE add-on"
|
||||||
|
$adkPath = (Get-ItemProperty -Path $adkRegKey -Name $adkRegValueName).$adkRegValueName
|
||||||
|
WriteLog "ADK located at $adkPath"
|
||||||
|
return $adkPath
|
||||||
|
# throw "Windows ADK is not installed or the installation path could not be found."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
function Get-WindowsESD {
|
function Get-WindowsESD {
|
||||||
|
|||||||
Reference in New Issue
Block a user