Konfigurieren des VM-Failovers zwischen virtuellen Netzwerken
Wichtig
Diese Version von Virtual Machine Manager (VMM) hat das Supportende erreicht. Sie sollten ein Upgrade auf VMM 2019 durchführen.
In diesem Artikel wird beschrieben, wie Sie die Replikation und das Failover von VMs zwischen virtuellen Netzwerken in System Center – Virtual Machine Manager (VMM) handhaben, wenn Sie nicht den Dienst Azure Site Recovery zur Verwaltung der Notfallwiederherstellung verwenden.
- Es wird empfohlen, dass Sie zur Replikation von VMs Azure Site Recovery verwenden. VMM verwaltet ohne Site Recovery keine Hyper-V-Replikate; zur Automatisierung von Hyper-V-Replikatvorgängen müssen Sie PowerShell-Cmdlets für Hyper-V-Replikate verwenden.
- Für die Notfallwiederherstellung wird empfohlen, dass Sie getrennte primäre und sekundäre virtuelle Netzwerke verwenden. Primäre VMs stellen eine Verbindung zum primären Netzwerk her und Replikat-VMs zum sekundären Netzwerk. Dadurch wird sichergestellt, dass beide VMs gleichzeitig eine Verbindung zum Netzwerk herstellen können.
- Wenn Sie ein einzelnes virtuelles Netzwerk haben, verwenden Sie zur Automatisierung der Netzwerkverwaltung Site Recovery mithilfe der Netzwerkzuordnungsfunktion. Wenn Sie Site Recovery nicht verwenden, müssen Sie die Voraussetzungen und die Reihenfolge, in der die VMs an das Netzwerk angefügt werden, gründlich prüfen. Besonders die Replikat- und primäre VM dürfen nicht gleichzeitig mit dem einzelnen virtuellen Netzwerk verbunden werden. Ansonsten besteht die Möglichkeit, dass die Datensätze der Client- und Provideradressen in VMM gelöscht werden und zum Verlust der Netzwerkverbindung führen.
Beispiellösung
Diese Beispiellösung beschreibt folgende Umgebung:
- Ein einzelner VMM-Server verwaltet sowohl primäre als auch sekundäre Standorte.
- Primäre und Replikat-VMs werden auf einem einzelnen virtuellen Hyper-V-Netzwerk gehostet.
- Sie sollten ein geplantes Failover ausführen und die IP-Adresse der VM nach dem Failover beibehalten.
- VMs verfügen über IPv4-Adressen.
Vorbereitung
Stellen Sie sicher, dass die Einstellungen für den virtuellen und den logischen Switch gültig sind und mit dem VMM-Fabric übereinstimmen. Wenn sie nicht übereinstimmen, schlagen Vorgänge zum Anfügen von Netzwerken nach dem Failover möglicherweise fehl.
Die primäre VM sollte mit einem virtuellen Netzwerk verbunden sein
Die Replikat-VM sollte mit keinem Netzwerk verbunden sein
Jedem Netzwerkadapter der primären VM sollte nur eine IP-Adresse zugewiesen werden. Führen Sie diesen Befehl aus, um dies sicherzustellen. Wenn sich auf der VM mehr als ein verbundener Netzwerkadapter befindet, führen Sie dies als Adapter aus, indem Sie den Arrayindex ändern.
$VMOnPD = Get-SCVirtualMachine -Name "VM Name" | where {$_.IsPrimaryVM -eq $true} Get-SCIPAddress –GrantToObjectId $VMOnPD.VirtualNetworkAdapters[0].ID``Stellen Sie sicher, dass die der VM vom Betriebssystem zugewiesene IP-Adresse der oben aufgeführten Adresse entspricht. Melden Sie sich auf der VM an, und führen Sie ipconfig aus, um dies zu überprüfen.
Überprüfen Sie, ob die Nachschlagetabellen ordnungsgemäß auf der primären und Replikat-VM eingerichtet sind. Führen Sie dazu den folgenden Befehl auf jedem Server aus, und achten Sie darauf, dass es einen entsprechenden Eintrag für die oben zurückgegebene IP-Adresse gibt:
Get-NetVirtualizationLookupRecord.Stellen Sie sicher, dass die IP-Adresse IPv4 ist und nicht IPv6
Stellen Sie sicher, dass beide VMs ausgeschaltet sind, bevor Sie die Skripts ausführen.
Stellen Sie sicher, dass der Replikationsstatus auf beiden VMs aktiviert ist.
Führen Sie das Skript für das geplante Failover aus
Dieses Skript macht Folgendes:
- Es speichert die IP-Adresse, das VM-Netzwerk und den IP-Pool für jeden Netzwerkadapter in einer primären VM.
- Es sperrt alle IP-Adressen für jeden Netzwerkadapter auf den primären und sekundären VMs.
- Es trennt die Verbindung zu allen Netzwerkadaptern.
- Es führt ein Failover der primären und sekundären VMs durch.
- Optional startet es die umgekehrte Replikation.
- Es übergibt die gleiche IP-Adresse (für jeden Netzwerkadapter) an die Replikat-VM.
- Es fügt jeden Netzwerkadapter auf der Replikat-VM an die VM-Netzwerke an, die in Schritt 1 gespeichert wurden.
Führen Sie das Skript aus.
Das Skript akzeptiert zwei Argumente:
- $VMName: Name des virtuellen Computers
- $ReverseRep: Boolesches Argument, das festlegt, ob eine umgekehrte Replikation durchgeführt werden soll
- Wenn „$true“ übergeben wird, wird die umgekehrte Replikation umgehend gestartet, und Sie können das Failover zu einem späteren Zeitpunkt nicht mehr abbrechen.
- Nachdem das Skript erfolgreich mit „$ReverseRep“ und „$true“ abgeschlossen wurde:
- Sollte sich die primäre VM im Replikationsstatus Prepared for planned failover (Auf geplantes Failover vorbereitet) befinden
- Sollte sich die Replikat-VM im Replikationsstatus Failover complete (Failover abgeschlossen) befinden
- Wenn „$false“ übergeben wird, wird keine umgekehrte Replikation durchgeführt. „ReverseRepORCancelFO.ps1“ kann zum Rückgängigmachen einer Replikation oder zum Abbrechen eines Failover verwendet werden
- Nachdem das Skript erfolgreich mit „$ReverseRep“ und „$false“ abgeschlossen wurde:
- Sollte sich die primäre VM im Replikationsstatus Prepared for planned failover (Auf geplantes Failover vorbereitet) befinden
- Sollte sich die Replikat-VM im Replikationsstatus Failover complete (Failover abgeschlossen) befinden
Wenn das Skript keinen dieser Schritte abschließt, müssen Sie die fehlgeschlagenen Schritte manuell abschließen und dann zum Fenster „PowerShell“ zurückkehren. Die Schritte des Skripts sind u.a. das Failover der primären VM, das Failover der Replikat-VM und die optionale umgekehrte Replikation.
Ausführen des Skripts:
Param(
[Parameter(Mandatory=$True)]
[string]$VMName,
[Parameter(Mandatory=$true)]
[boolean]$ReverseRep
)
# the script running on system with SCVMM Console/PowerShell installed. Also, requires Hyper-V powershell module.``
Import-Module hyper-v
## Refresh VM configuration and initialize
Write-Host -ForegroundColor Green (Get-Date) ".....Refreshing the VMs..."
Get-SCVirtualMachine -Name $VMName | Read-SCVirtualMachine
$VMOnPD = Get-SCVirtualMachine -Name $VMName | where {$_.IsPrimaryVM -eq $true}
$VMOnDR = Get-SCVirtualMachine -Name $VMName | where {$_.IsPrimaryVM -eq $false}
if ($VMOnPD.StatusString -ne "Stopped")
{
write-host -ForegroundColor Red (Get-Date) "....VM is not in stopped state. Actual State " $VMOnPD.StatusString
write-host -ForegroundColor Red (Get-Date) "....Exiting"
exit 1
}
$error.Clear()
$VMRepConfig = Get-VMReplication -ComputerName $VMOnPD.HostName -VMName $VMOnPD.Name
$VMRepConfig = Get-VMReplication -ComputerName $VMOnDR.HostName -VMName $VMOnPD.Name
if ($error -ne 0)
{
$temp = $VMOnPD.HostName.Split(".")
$primaryHostName = $temp[0]
$temp = $VMOnDR.HostName.Split(".")
$recoveryHostName = $temp[0]
write-host -ForegroundColor Red (Get-Date) "....Error in getting VM Replication state using FQDN, switching to Hostname"
write-host -ForegroundColor Yellow (Get-Date) "....Primary Hostname: " $primaryHostName " Replica Hostname: " $recoveryHostName
$error.Clear()
$VMRepConfig = Get-VMReplication -ComputerName $primaryHostName -VMName $VMOnPD.Name
$VMRepConfig = Get-VMReplication -ComputerName $recoveryHostName -VMName $VMOnPD.Name
if ($error -ne 0)
{
write-host -ForegroundColor Red (Get-Date) "....Error in getting VM Replication state using Hostname"
write-host -ForegroundColor Red (Get-Date) "....Exiting"
exit 1
}
write-host -ForegroundColor Green (Get-Date) "....Successful in getting VM Replication state using Hostname"
}
else
{
$primaryHostName = $VMOnPD.HostName
$recoveryHostName = $VMOnDR.HostName
}
$VMOnPDAdapter = Get-SCVirtualNetworkAdapter -VM $VMonPD
$VMOnDRAdapter = Get-SCVirtualNetworkAdapter -VM $VMonDR
$fileName = $VMName + (Get-Date).ToString() + ".txt"
$fileName = $fileName.Replace("/","_")
$fileName = $fileName.Replace(":","_")
Write-Host -ForegroundColor Yellow (Get-Date) "....Dumping network information for $VMName to file $fileName"
Write-Host -ForegroundColor Yellow (Get-Date) "....Number of Network adapters found: " $VMOnPDAdapter.count
$VMNetwork = @()
$VMSubnet = @()
$Pools = @()
$counter = 0
foreach($vmAdapter in $VMOnPDAdapter)
{
if ($vmAdapter.VMNetwork -eq $null)
{
$VMNetwork = $VMNetwork + $null
$VMSubnet = $VMSubnet + $null
$Pools = $Pools + $null
$counter = $counter + 1
continue
}
$VMNetwork = $VMNetwork + (Get-SCVMNetwork -Name $vmAdapter.VMNetwork.Name -ID $vmAdapter.VMNetwork.ID)
$VMSubnet = $VMSubnet + (Get-SCVMSubnet -Name $vmAdapter.VMSubnet.Name | where {$_.VMNetwork.ID -eq $vmAdapter.VMNetwork.ID})
#$PortClassification = Get-SCPortClassification | where {$_.Name -eq "Guest Dynamic IP"}
$Pools = $Pools + (Get-SCStaticIPAddressPool -IPv4 | where {$_.VMsubnet.name -eq $vmAdapter.VMSubnet.Name})
Out-File -FilePath $fileName -InputObject $VMNetwork[$counter] -Append
Out-File -FilePath $fileName -InputObject $VMSubnet[$counter] -Append
Out-File -FilePath $fileName -InputObject $Pools[$counter] -Append
$counter = $counter + 1
}
if ($error.Count -ne 0)
{
write-host -ForegroundColor Red (Get-Date) "....Error is gathering information for $VMName. No changes made"
write-host -ForegroundColor Red (Get-Date) "....Exiting"
exit 1
}
$IP = @()
$counter = 0
foreach($vmAdapter in $VMOnPDAdapter)
{
if ($VMNetwork[$counter] -eq $null)
{
Write-Host -ForegroundColor Yellow (Get-Date) ".....Network Adapter '" $counter "' not connected"
$IP = $IP + $null
$counter = $counter + 1
continue
}
## Revoke IP
$error.Clear()
$IP = $IP +(Get-SCIPAddress –GrantToObjectId $VMOnPD.VirtualNetworkAdapters[$counter].ID)
Write-Host -ForegroundColor Yellow (Get-Date) "....Revoking IP " $IP[$counter] "from Primary VM"
Revoke-SCIPAddress $IP[$counter]
if ($error.count -eq 0)
{
Write-Host -ForegroundColor Green (Get-Date) "....." $IP[$counter] "revoke completed"
}
## Disconnect Primary VM
Write-Host -ForegroundColor Yellow (Get-Date) "....Disconnecting Primary VM from Network " $VMNetwork[$counter]
Set-SCVirtualNetworkAdapter -VirtualNetworkAdapter $VMOnPD.VirtualNetworkAdapters[$counter] -NoLogicalNetwork -NoConnection -NoPortClassification
Write-Host -ForegroundColor Green (Get-Date) "....Network Adapter '" $counter "' of Primary VM Disconnected"
$counter = $counter + 1
}
## Start failover
Write-Host -ForegroundColor Yellow (Get-Date) ".....We are going to Failover " $VMName " from " $primaryHostName " to " $recoveryHostName
$error.Clear()
Start-VMFailover -ComputerName $primaryHostName -VMName $VMOnPD.Name -Prepare -Confirm:$false
start-sleep 5
Write-Host -ForegroundColor Yellow (Get-Date) ".....Completing Failover on Replica site..."
Start-VMFailover -ComputerName $recoveryHostName -VMName $VMOnDR.Name -Confirm:$false
if ($ReverseRep)
{
write-host -ForegroundColor Green (Get-Date) ".....Starting Reverse Replication..."
Set-VMReplication -ComputerName $recoveryHostName -reverse -VMName $VMOnDR.Name
}
if ($error -ne 0)
{
write-host -ForegroundColor Red (Get-Date) ".....Error occured during Planned Failover for VM $VMName"
write-host -ForegroundColor Red (Get-Date) ".....Please manually complete Failover before continuing"
Write-Host -ForegroundColor Red (Get-Date) ".....Press any key to continue..."
$ignoreKey = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
}
Write-Host -ForegroundColor Green (Get-Date) ".....Connecting Network(s) to Failed-over VM"
$counter = 0
foreach($vmAdapter in $VMOnPDAdapter)
{
if ($VMNetwork[$counter] -eq $null)
{
Write-Host -ForegroundColor Yellow (Get-Date) ".....Network Adapter '" $counter "' not connected"
$counter = $counter + 1
continue
}
Write-Host -ForegroundColor Yellow (Get-Date) "Granting " $IP[$counter] "to Failed-over VM"
Grant-SCIPAddress -GrantToObjectType "VirtualNetworkAdapter" -GrantToObjectID $VMOnDRAdapter[$counter].ID -StaticIPAddressPool $Pools[$counter] –IPAddress $IP[$counter]
Write-Host -ForegroundColor Green (Get-Date) "Granting IP completed"
Write-Host -ForegroundColor Yellow (Get-Date) "Connecting Replica VM to " $VMNetwork[$counter]
Set-SCVirtualNetworkAdapter -VirtualNetworkAdapter $VMOnDRAdapter[$counter] -IPv4AddressType static -VMNetwork $VMNetwork[$counter] -VMSubnet $VMSubnet[$counter]
Write-Host -ForegroundColor Green (Get-Date) "Network Adapter '" $counter "' of Failed-over VM connected to " $VMNetwork[$counter]
$counter = $counter + 1
}
Ausführen des Rückgängigmachens der Replikation/Abbrechen des Skripts
Dieses Skript macht Folgendes:
- Wenn Sie die umgekehrte Replikation im Failoverskript nicht ausgeführt haben, können Sie dieses Skript für die umgekehrte Replikation oder zum Abbrechen eines Failovers verwenden.
- Wenn Sie das Skript abbrechen, macht das Skript die Netzwerkschritte rückgängig und stellt die Verbindung der primären VM wieder her, nachdem die Verbindung zu Netzwerken der Replikat-VM unterbrochen wurde.
Führen Sie das Skript aus.
Dieses Skript sollte für das Failoverskript ausgeführt werden, während „$ReverseRep“ auf $false festgelegt ist. Dieses Skript akzeptiert drei Argumente:
- $VMName: VM-Name
- $ReverseRep: Boolesches Argument, das festlegt, ob die umgekehrte Replikation durchgeführt werden soll „$true“ gibt an, dass eine umgekehrte Replikation ausgeführt wird.
- $CancelFO: Boolesches Argument, das festlegt, ob das Failover abgebrochen wurde „$true“ gibt das Abbrechen an primären und wiederherstellten Standorten an.
„$true“ kann entweder an „$ReverseRep“ oder an „$CancelFO“, aber nicht an beide gleichzeitig übergeben werden. Nachdem das Skript erfolgreich ausgeführt wurde, sollte der Status beider VMs Replication enabled (Replikation aktiviert) sein.
Ausführen des Skripts:
Param(
[Parameter(Mandatory=$True)]
[string]$VMName,
[Parameter(Mandatory=$true)]
[boolean]$ReverseRep,
[Parameter(Mandatory=$true)]
[boolean]$CancelFO
)
# the script running on system with SCVMM Console/PowerShell installed. Also, requires Hyper-V powershell module.
Import-Module hyper-v
if ($ReverseRep -eq $CancelFO)
{
write-host -ForegroundColor Red (Get-Date) "....Please ensure that one and only one of the parameters -ReverseRep and -CancelFO is passed as $True"
write-host -ForegroundColor Red (Get-Date) "....Exiting"
exit 1
}
## Refresh VM configuration and initialize
Write-Host -ForegroundColor Green (Get-Date) ".....Refreshing the VMs..."
Get-SCVirtualMachine -Name $VMName | Read-SCVirtualMachine
$VMOnPD = Get-SCVirtualMachine -Name $VMName | where {$_.IsPrimaryVM -eq $true}
$VMOnDR = Get-SCVirtualMachine -Name $VMName | where {$_.IsPrimaryVM -eq $false}
$error.Clear()
$VMRepConfig = Get-VMReplication -ComputerName $VMOnPD.HostName -VMName $VMOnPD.Name
$VMRepConfig = Get-VMReplication -ComputerName $VMOnDR.HostName -VMName $VMOnPD.Name
if ($error -ne 0)
{
$temp = $VMOnPD.HostName.Split(".")
$primaryHostName = $temp[0]
$temp = $VMOnDR.HostName.Split(".")
$recoveryHostName = $temp[0]
write-host -ForegroundColor Red (Get-Date) "....Error in getting VM Replication state using FQDN, switching to Hostname"
write-host -ForegroundColor Yellow (Get-Date) "....Primary Hostname: " $primaryHostName " Replica Hostname: " $recoveryHostName
$error.Clear()
$VMRepConfig = Get-VMReplication -ComputerName $primaryHostName -VMName $VMOnPD.Name
$VMRepConfig = Get-VMReplication -ComputerName $recoveryHostName -VMName $VMOnPD.Name
if ($error -ne 0)
{
write-host -ForegroundColor Red (Get-Date) "....Error in getting VM Replication state using Hostname"
write-host -ForegroundColor Red (Get-Date) "....Exiting"
exit 1
}
write-host -ForegroundColor Green (Get-Date) "....Successful in getting VM Replication state using Hostname"
}
else
{
$primaryHostName = $VMOnPD.HostName
$recoveryHostName = $VMOnDR.HostName
}
if ($VMOnDR.ReplicationStatus.ReplicationState -ne "Recovered")
{
write-host -ForegroundColor Red (Get-Date) "....Replica VM is not in Failed over state. Actual State " $VMOnDR.ReplicationStatus.ReplicationState
write-host -ForegroundColor Red (Get-Date) "....Exiting"
exit 1
}
$error.Clear()
if ($ReverseRep -eq $true)
{
write-host -ForegroundColor Green (Get-Date) ".....Starting Reverse Replication..."
Set-VMReplication -ComputerName $recoveryHostName -reverse -VMName $VMOnDR.Name
if ($error -ne 0)
{
write-host -ForegroundColor Red (Get-Date) ".....Error occured during Reverse Replication for VM $VMName"
write-host -ForegroundColor Red (Get-Date) ".....Please manually complete Reverse replication"
exit 1
}
write-host -ForegroundColor Green (Get-Date) ".....Reverse Replication completed..."
exit 0
}
if ($VMOnDR.StatusString -ne "Stopped")
{
write-host -ForegroundColor Red (Get-Date) "....VM is not in stopped state. Actual State " $VMOnDR.StatusString
write-host -ForegroundColor Red (Get-Date) "....Exiting"
exit 1
}
$VMOnPDAdapter = Get-SCVirtualNetworkAdapter -VM $VMonPD
$VMOnDRAdapter = Get-SCVirtualNetworkAdapter -VM $VMonDR
$fileName = $VMName + (Get-Date).ToString() + ".txt"
$fileName = $fileName.Replace("/","_")
$fileName = $fileName.Replace(":","_")
Write-Host -ForegroundColor Yellow (Get-Date) "....Dumping network information for $VMName to file $fileName"
Write-Host -ForegroundColor Yellow (Get-Date) "....Number of Network adapters found on Failed-over VM: " $VMOnDRAdapter.count
$VMNetwork = @()
$VMSubnet = @()
$Pools = @()
$counter = 0
foreach($vmAdapter in $VMOnDRAdapter)
{
if ($vmAdapter.VMNetwork -eq $null)
{
$VMNetwork = $VMNetwork + $null
$VMSubnet = $VMSubnet + $null
$Pools = $Pools + $null
$counter = $counter + 1
continue
}
$VMNetwork = $VMNetwork + (Get-SCVMNetwork -Name $vmAdapter.VMNetwork.Name -ID $vmAdapter.VMNetwork.ID)
$VMSubnet = $VMSubnet + (Get-SCVMSubnet -Name $vmAdapter.VMSubnet.Name | where {$_.VMNetwork.ID -eq $vmAdapter.VMNetwork.ID})
#$PortClassification = Get-SCPortClassification | where {$_.Name -eq "Guest Dynamic IP"}
$Pools = $Pools + (Get-SCStaticIPAddressPool -IPv4 | where {$_.VMsubnet.name -eq $vmAdapter.VMSubnet.Name})
Out-File -FilePath $fileName -InputObject $VMNetwork[$counter] -Append
Out-File -FilePath $fileName -InputObject $VMSubnet[$counter] -Append
Out-File -FilePath $fileName -InputObject $Pools[$counter] -Append
$counter = $counter + 1
}
if ($error.Count -ne 0)
{
write-host -ForegroundColor Red (Get-Date) "....Error is gathering information for $VMName. No changes made"
write-host -ForegroundColor Red (Get-Date) "....Exiting"
exit 1
}
$IP = @()
$counter = 0
foreach($vmAdapter in $VMOnDRAdapter)
{
if ($VMNetwork[$counter] -eq $null)
{
Write-Host -ForegroundColor Yellow (Get-Date) ".....Network Adapter '" $counter "' not connected"
$IP = $IP + $null
$counter = $counter + 1
continue
}
## Revoke IP
$error.Clear()
$IP = $IP +(Get-SCIPAddress –GrantToObjectId $VMOnDR.VirtualNetworkAdapters[$counter].ID)
Write-Host -ForegroundColor Yellow (Get-Date) "....Revoking IP " $IP[$counter] "from Replica VM"
Revoke-SCIPAddress $IP[$counter]
if ($error.count -eq 0)
{
Write-Host -ForegroundColor Green (Get-Date) "....." $IP[$counter] "revoke completed"
}
## Disconnect Replica VM
Write-Host -ForegroundColor Yellow (Get-Date) "....Disconnecting Replica VM from Network " $VMNetwork[$counter]
Set-SCVirtualNetworkAdapter -VirtualNetworkAdapter $VMOnDR.VirtualNetworkAdapters[$counter] -NoLogicalNetwork -NoConnection -NoPortClassification
Write-Host -ForegroundColor Green (Get-Date) "....Network Adapter '" $counter "' of Replica VM Disconnected"
$counter = $counter + 1
}
## Cancel failover
Write-Host -ForegroundColor Yellow (Get-Date) ".....We are going to Cancel Failover " $VMName " on both " $primaryHostName " and " $recoveryHostName
$error.Clear()
Stop-VMFailover -ComputerName $recoveryHostName -VMName $VMName
Start-Sleep -Seconds 10
Stop-VMFailover -ComputerName $primaryHostName -VMName $VMName
if ($error -ne 0)
{
write-host -ForegroundColor Red (Get-Date) ".....Error occured during Cancel Failover for VM $VMName"
write-host -ForegroundColor Red (Get-Date) ".....Please manually Cancel Failover on both Primary and Recovery Server"
Write-Host -ForegroundColor Red (Get-Date) ".....Press any key to continue..."
$ignoreKey = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
}
Write-Host -ForegroundColor Yellow (Get-Date) ".....Connecting Network(s) back to the Primary VM"
$counter = 0
foreach($vmAdapter in $VMOnDRAdapter)
{
if ($VMNetwork[$counter] -eq $null)
{
Write-Host -ForegroundColor Yellow (Get-Date) ".....Network Adapter '" $counter "' not connected"
$counter = $counter + 1
continue
}
Write-Host -ForegroundColor Yellow (Get-Date) "Granting " $IP[$counter] "to Primary VM"
Grant-SCIPAddress -GrantToObjectType "VirtualNetworkAdapter" -GrantToObjectID $VMOnPDAdapter[$counter].ID -StaticIPAddressPool $Pools[$counter] –IPAddress $IP[$counter]
Write-Host -ForegroundColor Green (Get-Date) "Granting IP completed"
Write-Host -ForegroundColor Yellow (Get-Date) "Connecting Primary VM to " $VMNetwork[$counter]
Set-SCVirtualNetworkAdapter -VirtualNetworkAdapter $VMOnPDAdapter[$counter] -IPv4AddressType static -VMNetwork $VMNetwork[$counter] -VMSubnet $VMSubnet[$counter]
Write-Host -ForegroundColor Green (Get-Date) "Network Adapter '" $counter "' of Primary VM connected to " $VMNetwork[$counter]
$counter = $counter + 1
}