Upgrade a Windows Server failover cluster with a cluster OS rolling upgrade

Windows Server Datacenter Core 2022 -> 2025

  1. Prepare the cluster for the upgrade.
PS C:\> Get-ClusterNode

Name State Type
---- ----- ----
HYPER-V-1 Up Node
HYPER-V-2 Up Node

PS C:\> Get-CauRun
RunNotInProgress
WARNING: No Updating Run is currently in progress on cluster MyCluster.

PS C:\> Disable-CauClusterRole

Are you sure?
Do you want to disable the Cluster-Aware Updating clustered role on cluster "MyCluster"?
[Y] Yes [N] No [S] Suspend [?] Help (default is "Y"):
Disable-CauClusterRole : The current cluster (MyCluster) is not configured with a Cluster-Aware Updating clustered
role.
At line:1 char:1
+ Disable-CauClusterRole
+ ~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [Disable-CauClusterRole], ClusterUpdateException
+ FullyQualifiedErrorId : ClusterResourceNotFound,Microsoft.ClusterAwareUpdating.Commands.DisableCauClusterRoleCom
mand
  1. Transfer workloads off a node.
PS C:\> Suspend-ClusterNode -Name HYPER-V-1 -Drain

Name State Type
---- ----- ----
HYPER-V-1 Paused Node

PS C:\> Remove-ClusterNode -Name HYPER-V-1

Remove-ClusterNode
Are you sure you want to evict node HYPER-V-1?
[Y] Yes [N] No [S] Suspend [?] Help (default is "Y"):
  1. Collect diagnostic information
PS C:\> Get-NetLbfoTeam

Name : Team_Htbt
Members : {Ethernet4, Ethernet5}
TeamNics : Team_Htbt
TeamingMode : SwitchIndependent
LoadBalancingAlgorithm : Dynamic
Status : Up

Name : Team_Mgmt
Members : {Ethernet0, Ethernet1}
TeamNics : Team_Mgmt
TeamingMode : SwitchIndependent
LoadBalancingAlgorithm : Dynamic
Status : Up

Get-ComputerInfo -Property WindowsBuildLabEx,WindowsEditionID | Out-File -FilePath computerinfo.txt
systeminfo.exe | Out-File -FilePath systeminfo.txt
ipconfig /all | Out-File -FilePath ipconfig.txt
  1. Install the new version of Windows Server.

Perform an in-place upgrade of Windows Server

PS C:\> diskpart

Microsoft DiskPart version 10.0.20348.1

Copyright (C) Microsoft Corporation.
On computer: HYPER-V-1

DISKPART> list vol

Volume ### Ltr Label Fs Type Size Status Info
---------- --- ----------- ----- ---------- ------- --------- --------
Volume 0 D SSS_X64FREE UDF DVD-ROM 5735 MB Healthy
Volume 1 C NTFS Partition 89 GB Healthy Boot
Volume 2 FAT32 Partition 100 MB Healthy System
Volume 3 NTFS Partition 725 MB Healthy Hidden

DISKPART> exit

Leaving DiskPart...
PS C:\> cd D:\
PS D:\> dir

Directory: D:\

Mode LastWriteTime Length Name
---- ------------- ------ ----
d-r--- 9/6/2024 1:08 PM boot
d-r--- 9/6/2024 1:08 PM efi
d-r--- 9/6/2024 1:08 PM sources
d-r--- 9/6/2024 1:08 PM support
--r--- 9/6/2024 1:07 PM 128 autorun.inf
--r--- 9/6/2024 1:07 PM 473364 bootmgr
--r--- 9/6/2024 1:07 PM 2746288 bootmgr.efi
--r--- 9/6/2024 1:07 PM 99896 setup.exe


PS D:\> Start-Process -FilePath 'D:\setup.exe'
  1. Check in-place upgrade.
PS C:\> Get-ComputerInfo -Property WindowsProductName

WindowsProductName
------------------
Windows Server 2025 Datacenter
  1. Install any new server roles and features, such as NetworkATC .
Install-WindowsFeature -Name "NetworkATC" -IncludeAllSubFeature -IncludeManagementTools
  1. Check network and storage connectivity settings.
PS C:\> Get-NetLbfoTeam

Name : Team_Htbt
Members : {Ethernet4, Ethernet5}
TeamNics : Team_Htbt
TeamingMode : SwitchIndependent
LoadBalancingAlgorithm : Dynamic
Status : Up

Name : Team_Mgmt
Members : {Ethernet0, Ethernet1}
TeamNics : Team_Mgmt
TeamingMode : SwitchIndependent
LoadBalancingAlgorithm : Dynamic
Status : Up

PS C:\> ipconfig /all

PS C:\> Get-VMSwitchTeam -Name 'vSwitch'

Name NetAdapterInterfaceDescription TeamingMode LoadBalancingAlgorithm
---- ------------------------------ ----------- ----------------------
vSwitch {vmxnet3 Ethernet Adapter, vmxnet3 Ethernet Adapter #2} SwitchIndependent Dynamic

PS C:\> Get-Disk

Number Friendly Name Serial Number HealthStatus OperationalStatus Total Size Partition
Style
------ ------------- ------------- ------------ ----------------- ---------- ----------
1 MSFT Virtu... A1702DA2-7C96-411A-8634-5C829... Healthy Offline 2 GB GPT
2 MSFT Virtu... 40271301-BEE2-4852-8AA9-6D473... Healthy Offline 50 GB GPT
3 MSFT Virtu... 92844058-3574-485D-8D0D-672E4... Healthy Offline 99.85 GB GPT
0 VMware Vir... 6000c29d9547c048baca75c596d05f14 Healthy Online 90 GB GPT
  1. Add the upgraded node back to the cluster.
PS C:\> Add-ClusterNode -Cluster 'MyCluster' -Name 'HYPER-V-1'
PS C:\> Get-ClusterNode

Name State Type
---- ----- ----
HYPER-V-1 Up Node
HYPER-V-2 Up Node

PS C:\> Get-ClusterResource

Name State OwnerGroup ResourceType
---- ----- ---------- ------------
Cluster Disk 1 Online Cluster Group Physical Disk
Cluster IP Address Online Cluster Group IP Address
Cluster Name Online Cluster Group Network Name
SCVMM VM1 Online SCVMM VM1 Resources Virtual Machine
SCVMM VM1 Configuration Online SCVMM VM1 Resources Virtual Machine Configuration
Storage Qos Resource Online Cluster Group Storage QoS Policy Manager
Virtual Machine Cluster WMI Online Cluster Group Virtual Machine Cluster WMI

PS C:\> Move-ClusterVirtualMachineRole -Name 'SCVMM VM1 Resources' -Node HYPER-V-1

Name OwnerNode State
---- --------- -----
SCVMM VM1 Resources HYPER-V-1 Online
  1. Repeat the previous steps for every other node in the cluster.

  2. Update the cluster functional level and storage pool version.

PS C:\> Get-ClusterGroup

Name OwnerNode State
---- --------- -----
Available Storage HYPER-V-1 Offline
Cluster Group HYPER-V-1 Online
SCVMM VM1 Resources HYPER-V-2 Online

PS C:\> Get-ClusterNode

Name State Type
---- ----- ----
HYPER-V-1 Up Node
HYPER-V-2 Up Node

PS C:\> Get-Cluster | Select ClusterFunctionalLevel

ClusterFunctionalLevel
----------------------
11

PS C:\> Update-ClusterFunctionalLevel

Updating the functional level for cluster MyCluster.
Warning: You cannot undo this operation. Do you want to continue?
[Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"):

Name
----
MyCluster

PS C:\> Get-Cluster | Select ClusterFunctionalLevel

ClusterFunctionalLevel
----------------------
12
  1. Resume normal cluster operations and turn on new functionality.
PS C:\> Enable-CauClusterRole

Are you sure?
Do you want to enable the Cluster-Aware Updating clustered role on cluster "MyCluster"?
[Y] Yes [N] No [S] Suspend [?] Help (default is "Y"):
Enable-CauClusterRole : The current cluster (MyCluster) is not configured with a Cluster-Aware Updating clustered role.
At line:1 char:1
+ Enable-CauClusterRole
+ ~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [Enable-CauClusterRole], ClusterUpdateException
+ FullyQualifiedErrorId : ClusterResourceNotFound,Microsoft.ClusterAwareUpdating.Commands.EnableCauClusterRoleComm
and

PS C:\> Get-VMHostSupportedVersion -ComputerName HYPER-V-1

Name Version IsDefault
---- ------- ---------
Microsoft Windows 10 Anniversary Update/Server 2016 8.0 False
Microsoft Windows 10 Creators Update 8.1 False
Microsoft Windows 10 Fall Creators Update/Server 1709 8.2 False
Microsoft Windows 10 April 2018 Update/Server 1803 8.3 False
Microsoft Windows 10 October 2018 Update/Server 2019 9.0 False
Microsoft Windows 10 May 2019 Update/Server 1903 9.1 False
Microsoft Windows 10 May 2020 Update/Server 2004 9.2 False
Microsoft Windows 10 (Manganese) 9.3 False
Microsoft Windows Server 2022 10.0 False
Microsoft Host OS (Cobalt+) 10.5 False
Microsoft Windows 11 (22H2) 11.0 False
Microsoft Windows 11 (Copper) 11.1 False
Microsoft Windows 11 (Zinc) 11.2 False
Microsoft Windows Server 2025 12.0 True


PS C:\> Get-VM -ComputerName 'HYPER-V-2'

Name State CPUUsage(%) MemoryAssigned(M) Uptime Status Version
---- ----- ----------- ----------------- ------ ------ -------
VM1 Running 0 1024 00:06:15.1570000 Operating normally 10.0

PS C:\> Update-VMVersion -ComputerName 'HYPER-V-2' -Name * -WhatIf
What if: Performing a configuration version update of "VM1" will prevent it from being migrated to or imported on previous versions of Windows. This operation is not reversible.

Reference

Upgrade a Windows Server failover cluster with a cluster OS rolling upgrade

Troubleshooting

Issue: VM Migration failed with Error Id 1155.

PS C:\> Move-ClusterVirtualMachineRole -Name 'SCVMM VM1 Resources' -Node 'HYPER-V-2'
Move-ClusterVirtualMachineRole : Migration failed. Please check the event log for related events.
At line:1 char:1
+ Move-ClusterVirtualMachineRole -Name 'SCVMM VM1 Resources' -Node HYPE ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [Move-ClusterVirtualMachineRole], ClusterCmdletException
+ FullyQualifiedErrorId : InvalidOperation,Microsoft.FailoverClusters.PowerShell.MoveClusterVirtualMachineRoleCommand


PS C:\> Get-WinEvent -FilterHashTable @{LogName='System'; StartTime=(get-date).AddHours(-1); EndTime=(get-date); Level=3; ProviderName='Microsoft-Windows-FailoverClustering'} | fl *

Message : The pending move for the role 'SCVMM VM1 Resources' did not complete.
Id : 1155
Version : 0
Qualifiers :
Level : 3
Task : 3
Opcode : 0
Keywords : -9223372036854775808
RecordId : 2247
ProviderName : Microsoft-Windows-FailoverClustering
ProviderId : baf908ea-3421-4ca9-9b84-6689b8c6f85f
LogName : System
ProcessId : 4476
ThreadId : 3728
MachineName : HYPER-V-1.sj.com
UserId : S-1-5-18
TimeCreated : 9/27/2025 9:51:15 AM
ActivityId :
RelatedActivityId :
ContainerLog : System
MatchedQueryIds : {0}
Bookmark : System.Diagnostics.Eventing.Reader.EventBookmark
LevelDisplayName : Warning
OpcodeDisplayName : Info
TaskDisplayName : Node Mgr
KeywordsDisplayNames : {}
Properties : {System.Diagnostics.Eventing.Reader.EventProperty,
System.Diagnostics.Eventing.Reader.EventProperty}

The virtual machine is not compatible with the virtualization host (HPYER-V-2.sj.com).
The HYPER-V-1.sj.com is Windows server 2025, The HYPER-V-2.sj.com is Windows server 2022.

Solution:

Shutdown the virtual machine and then migrate.