[TUTORIAL] Netzwerksettings bei der Migration von Windows VM's zu PVE übernehmen

lucavornheder

Member
Feb 21, 2022
51
12
13
25
Germany | NRW / OWL
Hallo in die Runde,
leider gibt es das Problem, dass Windows Systeme bei der Migration zu Proxmox Ihre Netzwerksettings verlieren. Proxmox kann hier nichts für, da es sich um eine Eigenart von Windows handelt.

Wer den Gamechanger von Falk kennt, kann Windows VM's bereits sehr schnell und ohne viel Handarbeit zu Proxmox migrieren. Die Problematik mit den Netzwerksettings besteht hier aber noch immer.

Ich habe einen Weg gefunden, auch dieses zu vereinfachen. Die Idee ist die folgende:

Vorbereitung:
Während die VM noch auf dem alten Hypervisor läuft, installiert mit den Guest-Agent und die VirtIO Tools nach Falk seiner Anleitung. Anschließend exportiert man die Netzwerksettings (siehe Export Script unten).

Migration:
Anschließend migriert man die VM zu Proxmox, direkt mit SCSi Laufwerken und aktivierten Guest-Agent. Anschließend können über das import Script (siehe unten) die Settings wieder importiert werden. Das Script matched dabei die Macadressen, es ist also kein Problem, dass die Netzwerkadapter unter Proxmox anders heißen.

Die Steps der Vorbereitung sollten sich über Gruppenrichtlinien/EndpointManagement automatisieren lassen. Der Import der Netzwerksettings kann über den GuestAgent geschehen zB
Code:
qm guest exec 'vmID' -- powershell C:/net-import.ps1

Somit muss sich zu keinem Zeitpunkt im Windows eingeloggt werden.
In meinen Tests hat dieses sehr zuverlässig funktioniert, trotzdem bin ich auf euer Feedback gespannt, da ich dieses noch nicht in einem großen Setup testen konnte. Somit wie immer: Nutzung auf eigene Gefahr



Export Script:

Code:
<#
.SYNOPSIS
   Exportiert alle Netzwerkadaptereinstellungen basierend auf der MAC-Adresse.
#>

$exportPath = "C:\Temp\network_config.json"

$networkConfigs = @()

# Nur Adapter mit gültiger IPv4-Adresse berücksichtigen
$adapters = Get-NetIPConfiguration | Where-Object { $_.IPv4Address -ne $null }

foreach ($adapter in $adapters) {
    # Hole Adapterobjekt anhand des InterfaceIndex
    $netAdapter = Get-NetAdapter | Where-Object { $_.InterfaceIndex -eq $adapter.InterfaceIndex }

    if ($null -eq $netAdapter) {
        Write-Warning "Kein passender Adapter für InterfaceIndex $($adapter.InterfaceIndex) gefunden."
        continue
    }

    $mac = $netAdapter.MacAddress

    $config = [PSCustomObject]@{
        MACAddress       = $mac
        InterfaceAlias   = $adapter.InterfaceAlias
        IPv4Address      = $adapter.IPv4Address.IPAddress
        PrefixLength     = $adapter.IPv4Address.PrefixLength
        DefaultGateway   = $adapter.IPv4DefaultGateway.NextHop
        DNSServers       = ($adapter.DnsServer.ServerAddresses -join ",")
    }

    $networkConfigs += $config
}

$networkConfigs | ConvertTo-Json -Depth 5 | Out-File -Encoding UTF8 $exportPath

Write-Host "Netzwerkkonfiguration exportiert nach $exportPath"


Import Script:
Code:
$importPath = "C:\Temp\network_config.json"

if (-Not (Test-Path $importPath)) {
    Write-Error "Datei $importPath wurde nicht gefunden."
    exit
}

$configs = Get-Content $importPath | ConvertFrom-Json

foreach ($config in $configs) {
    $mac = $config.MACAddress
    $adapter = Get-NetAdapter | Where-Object { $_.MacAddress -eq $mac }

    if ($null -eq $adapter) {
        Write-Warning "Kein Adapter mit MAC $mac gefunden – wird übersprungen."
        continue
    }

    $alias = $adapter.Name

    Write-Host "Wende Konfiguration auf $alias (MAC $mac) an..."

    # Alte Einstellungen löschen (optional)
    try {
        Remove-NetIPAddress -InterfaceAlias $alias -Confirm:$false -ErrorAction SilentlyContinue
        Remove-NetRoute -InterfaceAlias $alias -Confirm:$false -ErrorAction SilentlyContinue
    } catch {}

    # Neue IP setzen
    New-NetIPAddress -InterfaceAlias $alias -IPAddress $config.IPv4Address -PrefixLength $config.PrefixLength -DefaultGateway $config.DefaultGateway

    # DNS setzen
    Set-DnsClientServerAddress -InterfaceAlias $alias -ServerAddresses ($config.DNSServers -split ",")
}

Write-Host "Import abgeschlossen."
 
Last edited:
  • Like
Reactions: fba and Johannes S
Cooles Ding, eine (envtl. etwas blöde) Frage hätte ich aber wie kriegst du die Skripte auf die Windows-VM, wenn du dich dafür nicht einloggst?