Command Palette

Search for a command to run...

Upgrade from Windows 10 to Windows 11 using PowerShell
Upgrade from Windows 10 to Windows 11 using PowerShell10.04.2025

On October 13, 2025, Microsoft will officially end support for Windows 10. For IT administrators and system managers, this deadline is more than a date on the calendar—it marks a significant shift in operational responsibilities and risk management.

While the upgrade to Windows 11 brings enhanced security, performance improvements, and a modernized user experience, the transition is not without its challenges. For organizations that still rely heavily on Windows 10 devices, the coming months will be critical.


The Workload for IT Managers

The end of Windows 10 support creates a clear urgency for IT teams. Planning large-scale operating system upgrades means:

  1. Coordinating schedules across multiple departments and offices.
  2. Minimizing downtime to avoid disruptions in critical business operations.
  3. Ensuring compatibility with legacy applications and hardware.
  4. Handling end-user support, communication, and troubleshooting during and after upgrades.

These tasks can quickly multiply, creating an increased workload for IT managers and stretching already limited resources.


The Challenge of Timing

Upgrading during normal working hours is rarely an option. Interrupting employees’ active sessions can lead to lost productivity, unsaved work, and frustration. As a result, most IT teams are forced to schedule upgrades outside of business hours—late nights, weekends, or holidays—making resource management even more difficult.


The Risks of Delaying

Organizations that fail to upgrade face critical risks, including:

  1. Security vulnerabilities: Without regular updates, systems running Windows 10 will become easy targets for malware, ransomware, and advanced cyberattacks.
  2. Compliance issues: Operating outdated systems may lead to regulatory non-compliance, especially in industries bound by strict data protection rules.
  3. Limited support: Hardware vendors and software providers will gradually stop offering Windows 10 compatibility, leaving IT with fewer support options.
  4. Operational downtime: In the event of a security breach or system failure, recovery costs and downtime can far outweigh the effort of planning an upgrade today.

Automating the Upgrade with PowerShell

Fortunately, automation can help reduce much of the manual burden. By using PowerShell scripts, IT managers can standardize and schedule Windows 10 to 11 upgrades across multiple machines—saving time and reducing errors.

Below is a placeholder section for a PowerShell script you can use to execute the upgrade in your environment:


# Define the log file path

$logFilePath = "C:\Windows11UpgradeLog.txt"

# Create a temporary download folder

$tempFolder = "C:\Windows11UpgradeTemp"

if (-Not (Test-Path $tempFolder)) {

New-Item -ItemType Directory -Path $tempFolder | Out-Null

}

# Define file download locations

$installAssistantUrl = "https://go.microsoft.com/fwlink/?linkid=2171764" # Updated link

$isoDownloadUrl = "https://www.microsoft.com/en-us/software-download/windows11"

# Define local file paths

$installAssistantPath = "$tempFolder\Windows11InstallationAssistant.exe"

$isoDownloadPath = "$tempFolder\Windows11ISO.html" # Save the link since ISO download requires interaction

# Function to log messages with a timestamp

function Log-Message {

param (

[string]$message

)

# Append the message with a timestamp to the log file

"$((Get-Date).ToString('yyyy-MM-dd HH:mm:ss')) - $message" | Out-File -FilePath $logFilePath -Append

}

# Check for 64-bit architecture CPU

try {

$cpu = Get-CimInstance Win32_Processor

if ($cpu.AddressWidth -eq 64) {

Log-Message "CPU architecture is 64-bit: true"

} else {

Log-Message "CPU architecture is 64-bit: false"

}

} catch {

Log-Message "Failed to retrieve CPU architecture information."

}

# Check for TPM 2.0

$TPM_Enabled = $false

try {

$tpm = Get-WmiObject -Namespace "Root\CIMv2\Security\MicrosoftTpm" -Class Win32_Tpm

if ($tpm.SpecVersion -like "2.0*") {

Log-Message "TPM 2.0 is enabled: true"

$TPM_Enabled = $true

} else {

Log-Message "TPM 2.0 is enabled: false"

}

} catch {

Log-Message "Failed to retrieve TPM information."

}

# Check for Secure Boot

$SecureBoot_Enabled = $false

try {

$secureBoot = Confirm-SecureBootUEFI

if ($secureBoot) {

Log-Message "Secure Boot is enabled: true"

$SecureBoot_Enabled = $true

} else {

Log-Message "Secure Boot is enabled: false"

}

} catch {

Log-Message "Failed to retrieve Secure Boot status."

}

# If TPM 2.0 or Secure Boot is missing, cancel the upgrade

if (-not $TPM_Enabled -or -not $SecureBoot_Enabled) {

Log-Message "System does not meet Windows 11 requirements (TPM 2.0 or Secure Boot missing). Upgrade cancelled."

Exit

}

# Function to download the Windows 11 Installation Assistant

function Download-InstallationAssistant {

try {

Log-Message "Downloading Windows 11 Installation Assistant..."

Invoke-WebRequest -Uri $installAssistantUrl -OutFile $installAssistantPath

Log-Message "Download completed: $installAssistantPath"

} catch {

Log-Message "Failed to download Windows 11 Installation Assistant."

}

}

# Function to save the Windows 11 ISO download link

function Save-ISO-DownloadLink {

try {

Log-Message "Saving Windows 11 ISO download link..."

"<html><body><a href='$isoDownloadUrl'>Download Windows 11 ISO</a></body></html>" | Out-File -FilePath $isoDownloadPath

Log-Message "ISO download link saved to: $isoDownloadPath"

} catch {

Log-Message "Failed to save Windows 11 ISO download link."

}

}

# Function to install the Windows 11 Installation Assistant

function Install-InstallationAssistant {

try {

# Define the arguments

$arguments = "/QuietInstall /SkipEULA /Auto Upgrade /ShowProgressInTaskBarIcon"

Log-Message "Starting Windows 11 Installation Assistant with arguments: $arguments"

# Start the installation assistant with the defined arguments

$process = Start-Process -FilePath $installAssistantPath -ArgumentList $arguments -PassThru -NoNewWindow

# Immediately log the process ID after starting the process

Log-Message "Windows 11 Installation Assistant started with ID: $($process.Id)"

# Wait for the process to exit

$process.WaitForExit()

# Check if the process has exited and log the exit code

if ($process.HasExited) {

Log-Message "Windows 11 Installation Assistant process has exited with code: $($process.ExitCode)"

}

} catch {

Log-Message "Failed to start Windows 11 Installation Assistant. Error: $_"

}

}

# Check if the Installation Assistant is already downloaded

if (Test-Path $installAssistantPath) {

Log-Message "Windows 11 Installation Assistant is already downloaded."

} else {

Download-InstallationAssistant

}

# Save the ISO download link

Save-ISO-DownloadLink

# Run the installation assistant

if (Test-Path $installAssistantPath) {

Install-InstallationAssistant

} else {

Log-Message "Installation Assistant not found, skipping installation."

}

Log-Message "Script execution completed."



Moving Forward

The transition from Windows 10 to Windows 11 is not just a technical necessity—it’s a strategic step in safeguarding your organization’s security and efficiency. By preparing now, IT managers can minimize disruption and ensure a smooth migration before the support deadline arrives.


Did you know that you can deploy this script in bulk with Monitic RMM and complete your Windows 11 migration? https://www.monitic.com