#Requires -Version 5.1 <# JbTecWiz Support Centre -- generated fix script Fault : Live Migration fails -- 0x8009030E and delegation errors Fix : Configure constrained delegation between the hosts Source: https://jbtecwiz.com/support/srv-clu-live-migration Run as : Elevated PowerShell with directory rights Expect : 60 minutes Risk : medium Reversible : yes WHEN THIS IS THE RIGHT FIX Migration works locally and fails remotely. HOW TO UNDO IT Clear msDS-AllowedToDelegateTo on the computer objects, or set the authentication type back to CredSSP. This script walks the fix one step at a time and asks before each one. Steps with no command are things you do yourself -- it prints those and waits. Run with -DryRun to print without executing. -------------------------------------------------------------------- NO WARRANTY - USE AT YOUR OWN RISK This script is provided by JbTecWiz as-is and with no warranty of any kind, express or implied. You run it entirely at your own risk. JbTecWiz accepts no liability for any loss or damage arising from its use, including but not limited to data loss, downtime, or configuration changes that turn out to be wrong for your system. You are responsible for reading this script before running it, for satisfying yourself that it suits the machine in front of you, and for having a working backup first. Some steps cannot be undone. -------------------------------------------------------------------- #> [CmdletBinding()] param( # Print every step and command without running anything. [switch]$DryRun, # Do not ask before each step. Read the script first if you use this. [switch]$Unattended ) $ErrorActionPreference = 'Stop' $script:Failed = 0 function Write-Rule { param([string]$Text) Write-Host '' Write-Host ('-' * 70) -ForegroundColor DarkGray if ($Text) { Write-Host $Text -ForegroundColor Cyan } } function Show-Prose { param([string]$Text, [string]$Colour = "Gray") if (-not $Text) { return } $words = $Text -split "\s+"; $line = " " foreach ($w in $words) { if (($line.Length + $w.Length) -gt 74) { Write-Host $line -ForegroundColor $Colour; $line = " " } $line += "$w " } if ($line.Trim()) { Write-Host $line -ForegroundColor $Colour } } function Invoke-Step { param( [int]$Number, [string]$Do, [string]$Why, [scriptblock]$Command, [switch]$Manual, [string]$Shell = "powershell" ) Write-Rule " Step $Number of 6" Show-Prose $Do "White" if ($Why) { Write-Host ""; Show-Prose $Why "DarkGray" } if ($Manual) { Write-Host '' Write-Host ' -> Do this yourself, then press Enter to carry on.' -ForegroundColor Yellow if (-not $Unattended -and -not $DryRun) { [void](Read-Host) } return } Write-Host '' foreach ($l in ($Command.ToString().Trim() -split "`n")) { Write-Host (" " + $l.Trim()) -ForegroundColor Green } Write-Host '' if ($DryRun) { Write-Host " (dry run -- not executed)" -ForegroundColor DarkGray; return } if (-not $Unattended) { $a = Read-Host " Run this step? [Y]es / [S]kip / [Q]uit" if ($a -match "^[Qq]") { Write-Host " Stopped at your request."; exit 0 } if ($a -match "^[Ss]") { Write-Host " Skipped." -ForegroundColor DarkGray; return } } try { & $Command } catch { $script:Failed++ Write-Host (" Step $Number failed: " + $_.Exception.Message) -ForegroundColor Red Show-Prose "The rest of the fix may depend on this. Read the write-up before carrying on." "Red" if (-not $Unattended) { $c = Read-Host " Carry on anyway? [y/N]" if ($c -notmatch "^[Yy]") { exit 1 } } } } Write-Rule Write-Host ' Live Migration fails -- 0x8009030E and delegation errors' -ForegroundColor White Write-Host ' Configure constrained delegation between the hosts' -ForegroundColor Cyan Write-Host '' Write-Host ' Risk: medium Reversible 60 minutes' Write-Host '' Show-Prose 'No warranty. Use at your own risk - JbTecWiz accepts no liability. Read it before you run it, and have a backup.' 'DarkYellow' Write-Rule if (-not $Unattended -and -not $DryRun) { $go = Read-Host ' Ready? [y/N]' if ($go -notmatch "^[Yy]") { Write-Host " Nothing was changed."; exit 0 } } Invoke-Step -Number 1 -Do 'Confirm the authentication protocol in use.' -Command { Get-VMHost | Format-List ComputerName,VirtualMachineMigrationEnabled,VirtualMachineMigrationAuthenticationType,VirtualMachineMigrationPerformanceOption } Invoke-Step -Number 2 -Do 'Switch both hosts to Kerberos.' -Command { Set-VMHost -VirtualMachineMigrationAuthenticationType Kerberos Enable-VMMigration } Invoke-Step -Number 3 -Do 'Configure delegation on each host''s computer object, for every other host it will migrate to. This has to be done in both directions.' -Why 'Both service principal names are required. The migration service moves the virtual machine''s state and CIFS moves its files -- configuring only the first produces a migration that starts and then fails partway with the same error.' -Command { $hosts = 'HV01','HV02','HV03' foreach ($src in $hosts) { foreach ($dst in $hosts | Where-Object { $_ -ne $src }) { Set-ADComputer -Identity $src -Add @{ 'msDS-AllowedToDelegateTo' = @("Microsoft Virtual System Migration Service/$dst.example.local", "cifs/$dst.example.local") } } } } Invoke-Step -Number 4 -Do 'Set the delegation to Kerberos only, not "any authentication protocol", which is a broader grant than this needs.' -Command { Get-ADComputer HV01 -Properties msDS-AllowedToDelegateTo,TrustedForDelegation | Format-List Name,TrustedForDelegation,msDS-AllowedToDelegateTo } Invoke-Step -Number 5 -Do 'Restart the hosts, or at minimum the Hyper-V Virtual Machine Management service, so the change takes effect.' -Command { Restart-Service vmms } Invoke-Step -Number 6 -Do 'Test a migration from a remote management session.' -Manual Write-Rule " Confirm it worked" Show-Prose 'A live migration started from a management workstation completes.' 'White' Write-Host '' if (-not $DryRun) { Move-VM -Name TestVM -DestinationHost HV02 -IncludeStorage -DestinationStoragePath C:\ClusterStorage\Volume1\TestVM } Write-Rule if ($script:Failed -gt 0) { Write-Host (" Finished with " + $script:Failed + " failed step(s).") -ForegroundColor Yellow Show-Prose 'Read the full write-up at https://jbtecwiz.com/support/srv-clu-live-migration' 'Yellow' } else { Write-Host ' Finished.' -ForegroundColor Green } Write-Host '' Show-Prose 'To undo: Clear msDS-AllowedToDelegateTo on the computer objects, or set the authentication type back to CredSSP.' 'DarkGray' Write-Rule