Migration aller VMs eines Hyper-V Hosts per Powershell

Veröffentlicht in: Hyper-V, Powershell, VMM

Mit dem folgenden Powershell snipplet werden alle VMs eines Hyper-V Hosts (hier eines Clusterknotens, –HighAvailablity $true) auf einen anderen Hyper-V Host migriert.
Mittels des –RunAsyncronously attributes kann festgelegt werden, ob eine VM nach der Anderen oder so viele wie die Migrationseinstellungen der Host gleichzeitig zulassen migriert werden:

$SourceHost = Get-SCVMHost | where { $_.Name -eq „<souceHost-FQDN>“ }

$TargetHost = Get-SCVMHost | where { $_.Name -eq „<TargetHost-FQDN>“ }

# alle VMs des Sourcehost bestimmen

$VMs = Get-SCVirtualMachine -VMHost $SourceHost

#Schleife um alle VMs (asynchron) zu migrieren

ForEach($VM in $VMs)

{

Move-SCVirtualMachine -VM $VM -VMHost $TargetHost -HighlyAvailable $true -RunAsynchronously

}

Powershell: Uninstall a software/program

Veröffentlicht in: Powershell, VMM

to uninstall a software, from for example a core server, using powershell you may use these script snipplets I found today having the need to uninstall a program rom a non GUI server.

At first you may want to list all installed programs:

Get-WmiObject -Class Win32_Product

Look for the software to uninstall in that list and copy a significant part of the “Name” to clipboard.

(i was looking to uninstall the “MS VMM DHCP Server (x64)” stuff, so I entered the following line to filter just for that:

Get-WmiObject -Class Win32_Product -Filter „Name like ‚%DHCP Server%'“

and then added the uninstall routine to the command to finallize the removal of the software:

Get-WmiObject -Class Win32_Product -Filter „Name like ‚%Microsoft System Center Virtual Machine Manager DHCP Server (x64)%'“ | ForEach-Object { $_.Uninstall()}

Finally you may want to check that the software is really not listed anymore using:

Get-WmiObject -Class Win32_Product

PowerShell: Umstellung von dynamischer (per DHCP vergebener) auf statische IP Konfiguration

Veröffentlicht in: Allgemein, Powershell, VMM

Mit dem folgenden, nicht invasivem, also nur lesendem Skript kann man alle “Computername*” Systeme auf dynamische IP Konfiguration überprüfen:

Clear-Host

# ggf. für Vorarbeiten: Alle Clusternodes der Domain bestimmen
get-cluster -Domain QS | get-clusternode

# da Cluster auf eine IP Änderung evtl. mit einem Clusterdown aufgrund von Heartbeatverlust reagieren,
# wenn die Änderungen bei zwei Knoten des Cluster kurz hintereinander durchgeführt werden
# daher sollten Knoten mit dynamischer IP Konfiguration ggf. manuell, bzw.durch Ändern des
# „Name -like“ Suchparameters weiter unten, einzeln umgestellt werden

# Array $ServerVMs mit zu prüfenden VMs füllen, hier alle mit Server* OS und Computernamen die mit Computername* anfangen
$ServerVMs = Get-ADComputer -Filter {OperatingSystem -Like ‚*Server*‘ -and Name -like ‚Computername*‘} | select -Expand DNSHostName

#Schleife die jede der VMs des Arrays durchgeht
foreach ($ServerVM in $ServerVMs)
{
Write-Host Teste auf DHCP NICs in $ServerVM …

# Listet alle Systeme in $ServerVMs mit dynamischer IP Konfiguration
Get-WmiObject Win32_NetworkAdapterConfiguration -ComputerName $ServerVM | where{$_.IPEnabled -eq $true -and $_.DHCPEnabled -eq $true}

}

 

Weiterhin kann das erweiterte Skript dann Systeme mit dynamischer auf statische IP Konfiguration umstellen und behält dabei die ehemals dynamischen Werte bei:

Clear-Host

# ggf. für Vorarbeiten: Alle Clusternodes der Domain bestimmen
get-cluster -Domain QS | get-clusternode

# da Cluster auf eine IP Änderung evtl. mit einem Clusterdown aufgrund von Heartbeatverlust reagieren,
# wenn die Änderungen bei zwei Knoten des Cluster kurz hintereinander durchgeführt werden
# daher sollten Knoten mit dynamischer IP Konfiguration ggf. manuell, bzw.durch Ändern des
# „Name -like“ Suchparameters weiter unten, einzeln umgestellt werden

# Array $ServerVMs mit zu prüfenden VMs füllen, hier alle mit Server* OS und Computernamen die mit ‚Computername*‘ anfangen
$ServerVMs = Get-ADComputer -Filter {OperatingSystem -Like ‚*Server*‘ -and Name -like ‚Computername*‘} | select -Expand DNSHostName

#Schleife die jede der VMs des Arrays durchgeht
foreach ($ServerVM in $ServerVMs)
{
Write-Host Teste auf DHCP NICs in $ServerVM …

# Array mit allen Netzwerkkarten mit dynamischer IP der spezifischen VM aufbauen
# durch weglassen von „$NICs =“ an anfagng, bekommt man die betroffenen Systeme (mit dynamischer IP) aufgelistet
# dann sollte aber auch die (äußere) ForEach Schleife mit <# #> auskommentiert werden
$NICs = Get-WmiObject Win32_NetworkAdapterConfiguration -ComputerName $ServerVM | where{$_.IPEnabled -eq $true -and $_.DHCPEnabled -eq $true}

# Für jede dieser Netzwerkkarten die  Umstellung auf statische IP Konfiguration
# unter Beibehaltung der Daten der dynamischen Konfiguration (IP, Subnetz, Gateway, DNS Server)
ForEach ($NIC in $NICs)
{
# bisherige IP Daten in $ip, $subnet, $gateway, $dns schreiben
$ip = ($NIC.IPAddress[0])
$subnet = $NIC.IPSubnet[0] $gateway = $NIC.DefaultIPGateway
$dns = $NIC.DNSServerSearchOrder

# statische Konfiguration aktivieren, mit den Daten aus der dynamischen Konfiguration
$NIC.EnableStatic($ip,$subnet)
$NIC.SetGateways($gateway,1)
$NIC.SetDNSServerSearchOrder($dns)
$NIC.SetDynamicDNSRegistration(„FALSE“)
}
}

Powershell: Processor Combatibility mode für Hyper-V VMs

Veröffentlicht in: Allgemein, Powershell, VMM

Die CPU Kompatibilität für virtuelle Hyper-V Maschinen kann zur Live Migration der VMs auf einen Host mit einer anderen Prozessor Generation notwendig sein.
Daher empfehle ich immer diesen Modus auf allen VMs zu aktiveren, die nicht explizit auf die erweiterten Features angewiesen sind.

 

image

 

Im aktuellen Projekt hatten wir die Herausforderung dies bei allen VMs einer Domain umzustellen, natürlich dann nicht mehr per Hand/GUI, sondern natürlich mal wieder per PowerShell! Smiley

 

Ich habe also mal schnell ein kleine Skript gebaut, welches das für alle VMs einer Domain mit integriertem System Center Virtual Maschine Manager (VMM) umsetzt:

Voraussetzung ist, das alle VMs ausgeschaltet/heruntergefahren sein müssen!

 

Clear-Host

$VMs = Get-SCVirtualMachine

ForEach ($VM in $VMs)

{

Write-Host

Write-Host „Setze LimitCPUForMigration auf ‚true‘ für VM “ $VM -ForegroundColor Yellow

# ohne Setzen von GuestOS Shutdown:

Set-SCVirtualMachine -VM $VM  -CPULimitForMigration $true

# mit Setzen von GuestOS Shutdown:

# Set-SCVirtualMachine -VM $VM -CPULimitForMigration $true -StopAction ShutdownGuestOS

}

 

Der zweite (auskommentierte Teil) der Schleife würde auf der VM auch gleich das automatische Herunterfahren der VM (standard ist hier “speichern/safe state”) bei der “Automatic Stop Action” eintragen.
Dies haben wir hier beim Kunden auch direkt mit umgesetzt.