PowerShell-Grundlagen: Praxistipps zum Arbeiten mit Get-VM

Get-VM gehört zu den grundlegendsten und damit wichtigsten PowerShell-Befehlen. Dabei kann das Cmdlet weit mehr, als nur den VM-Status abfragen.

Mit dem PowerShell-Cmdlet Get-VM können Hyper-V-Administratoren eine Vielzahl an VM-Konfigurationen einsehen und modifizieren. Microsoft hat in den letzten Jahren viel Zeit und Arbeit in die Verbesserung zum Management lokaler und entfernter Server per PowerShell gesteckt.

Die PowerShell-Kommandozeile steht für die meisten Serverrollen zur Verfügung, während Microsoft immer weiter an neuen und aus Verbesserungen bestehender PowerShell-Cmdlets arbeitet, um die Automatisierung immer wiederkehrender Aufgaben zu erleichtern.

Liste der Hyper-V-Server ermitteln

Bevor wir uns gleich dem PowerShell-Cmdlet Get-VM genauer zuwenden, brauchen wir eine Liste der Hyper-V-Server, die zu einer Active-Directory-Domäne gehören. Die Ausgabe speichern wir in eine kommaseparierte Textdatei (CSV). Das nachfolgende Script erledigt genau das und kann von einem Computer aus gestartet werden, der die PowerShell-Module für Active Directory installiert hat.

 

$ResultFile = "C:\Temp\HyperVServers.CSV"

Remove-item $ResultFile -ErrorAction SilentlyContinue

$STR = "Hyper-V Server, Operating System"

Add-Content $ResultFile $STR

 

$AllHyperVServers = Get-ADObject -Filter 'ObjectClass -eq

"serviceConnectionPoint" -and Name -eq "Microsoft Hyper-V"'-

ErrorAction SilentlyContinue

 

foreach($Item in $AllHyperVServers)

{     

   $Item.DistinguishedName

 

   $DN1, $DN2, $DN3 = $Item.DistinguishedName.Split(",")

   $RC1, $RC2 = $DN2.Split("=") 

 

   $DN1,$DN2 = $Item.DistinguishedName.split(",")

   $ThisItem = Get-ADComputer -Id $RC2 -Properties *

 

   $HyperVServerNow = $ThisItem.Name

   $HyperVOSVersionNow = $ThisItem.OperatingSystem

   $HyperVServerNow

   $HyperVOSVersionNow

   $STR = $HyperVServerNow+","+$HyperVOSVersionNow

   Add-Content $ResultFile $STR

}          

 

Nach erstmaliger Ausführung dieses Skripts wird die entstehende Textdatei mit den Namen und Betriebssystemversionen aller Hyper-V-Server befüllt. In Excel geöffnet sieht das dann in etwa so aus wie in Abbildung 1.

Abbildung 1: Liste aller Hyper-V-Server und deren Betriebssysteme.

Manche PowerShell-Cmdlets funktionieren nur mit bestimmten Hyper-V-Betriebssystemen. Daher ist es vorteilhaft, die Versionsnummer des Betriebssystems mit in der Datei zu speichern.

Das PowerShell-Cmdlet Get-VM

Das PowerShell Cmdlet Get-VM bietet weit mehr als nur die Möglichkeit, die standardmäßige VM-Konfiguration eines Hyper-V-Servers aufzuführen. Tippt man auf einem lokalen Hyper-V-Host lediglich Get-VM ein, so erhält man eine Liste aller auf diesem Host konfigurierten virtuellen Maschinen. Benötigt man dieselbe Information stattdessen von einem Remote-Host, so gibt man einfach dessen Computernamen als Parameter ComputerName an:

Get-VM –ComputerName <RemoteHyper-V Server Name>

Schleifenmechanismus ForEach

Mit dem zuletzt gezeigten Befehl lässt sich eine Auflistung aller VMs auf einem einzelnen Remote-Server abrufen. Was aber, wenn man dies für mehr als einen einzigen Hyper-V-Host durchführen möchte? Um eine Liste aller virtuellen Maschinen und deren Konfigurationen von mehreren Remote-Servern zu erhalten, kann eine ForEach-Schleife eingesetzt werden. Dies wird im folgenden Code gezeigt:

 

$ServerFile = “C:\Temp\HyperVServers.CSV”

$CSV = Import-CSV $ServerFile

ForEach ($Item in $CSV)

{

$HyperVServerName = $Item.’Hyper-V Server’

$HyperVOS = $Item.’Operating System’

< Hyper-V PowerShell Command goes here >

}

 

In diesem Skript erkennt man den Dateinamen HyperVServers.CSV. Diese kommaseparierte Textdatei, die sich vortrefflich in Microsoft Excel bearbeiten lässt, enthält eine Liste aller Hyper-V-Server und ihrer Betriebssystemversionen. Das Skript importiert die Dabei HyperVServers.CSV in die Variable $CSV. Durch die ForEach-Schleife werden deren Inhalte sukzessive in die Variablen $HyperVServerName und $HyperVOS für den Servernamen und die Betriebssystemversion übernommen. Um nun ein Get-VM-Kommando an jeden Hyper-V-Server zu senden, der in der CSV-Datei aufgeführt ist, würde das Skript so aussehen:

 

$ServerFile = “C:\Temp\HyperVServers.CSV”

$CSV = Import-CSV $ServerFile

ForEach ($Item in $CSV)

{

$HyperVServerName = $Item.’Hyper-V Server’

$HyperVOS = $Item.’Operating System’

Get-VM –ComputerName $HyperVServerName

}

 

Will man die VM-Konfiguration eines beliebigen Hyper-V-Betriebssystems ermitteln, so lassen sich über eine IF-Abfrage entsprechende Bedingungen überprüfen. Im folgenden Beispiel erfolgt dies für die Betriebssystemversion des Hosts, bevor das Kommando Get-VM angewendet wird.

 

$ServerFile = “C:\Temp\HyperVServers.CSV”

$CSV = Import-CSV $ServerFile

ForEach ($Item in $CSV)

{

$HyperVServerName = $Item.’Hyper-V Server’

$HyperVOS = $Item.’Operating System’

IF ($HyperVOS –eq “Windows Server 2012”)

{

Get-VM –ComputerName $HyperVServerName

}

}

 

Eigenschaften von Get-VM

Oben wurde es bereits kurz angerissen: Das PowerShell-Cmdlet Get-VM bietet weit mehr Eigenschaften, die spezifische Informationsarten ermitteln können. Nutzt man Get-VM ohne Parameter, so liefert es nur den Namen, Zustand, die CPU-Auslastung, den zugewiesenen Speicher und die Uptime einer virtuellen Maschine. Möchte man erfahren, welche weiteren Eigenschaften Get-VM in Petto hat, so führt man auf einem lokalen Hyper-V-Host einfach den Befehl Get-VM | Get-Member aus. Abbildung 2 zeigt, wie man mit Get-VM auch Auflistungen anderer Informationen erreichen kann. Darunter beispielsweise die Information, wann eine VM erstellt wurde, ob dynamischer Speicher aktiviert ist oder auch welche Netzwerkadapter mit der VM verbunden sind.

Eigenschaften von Get-VM.
Abbildung 2: Eigenschaften von Get-VM.

Möchten man zum Beispiel den dynamischen Speicherstatus aller virtueller Maschinen auf einem Hyper-V-Server erfahren, der in der Datei HyperVServers.CSV aufgeführt ist, und daraus eine CSV-Berichtsdatei generieren, so könnte dies folgendermaßen durchgeführt werden:

 

$ServerFile = "C:\Temp\HyperVServers.CSV"

$CSV = Import-CSV $ServerFile

$ReportFile = "C:\Temp\HyperVReport.CSV"

$STR = "Hyper-V Server, Command Status, VM Name, Dynamic Memory Status"

Add-Content $ReportFile $STR

ForEach ($Item in $CSV)

{

$HypervServerName = $Item.'Hyper-V Server'

$HyperVOS = $Item.'Operating System'

 

$ComStatus = "Ok"

$Error.Clear()

$RVM = Get-VM -ComputerName $HypervServerName | select-Object Name, DynamicMemoryEnabled

IF ($Error.Count -eq 0)

{

### START - Command Goes Here ####

   ForEach ($ItemVM in $RVM)

   {

   $VMName = $ItemVM.Name

   $DMStatus = $ItemVM.DynamicMemoryEnabled

 

   $STR = $HypervServerName+",OK,"+$VMName+","+$DMStatus

   }

### END - Command Goes Here ####

}

else

{

   $ErrorNow = $Error[0].Exception.Message

   $ComStatus = "Error Executing Command: Error: "+$ErrorNow

   $STR = $HypervServerName+","+$ComStatus

   Add-Content $ReportFile $STR

 

}

}

 

Hat man diesen Schritt durchgeführt, so findet man unter C:\Temp\HyperVReport.CSV einen Bericht, der auch die Information enthält, ob der dynamische Speicher auf der jeweiligen VM aktiviert ist (vgl. Abbildung 3).

Anzeige des dynamischen Speicherstatus für VMs auf einem Hyper-V-Server.
Abbildung 3: Anzeige des dynamischen Speicherstatus für VMs auf einem Hyper-V-Server.

Weiß man erst einmal, welche VM-Konfiguration man aus einem oder mehreren Hyper-V-Servern untersuchen will, so greift man einfach zur Eigenschaft seiner Wahl und probiert sie in dem oben aufgeführten Skript aus. Dabei sollte man durchaus auch Änderungen im Bereich ### START - Command Goes Here #### ausprobieren.

Weitere Artikel zur PowerShell:

Kostenloses E-Handbook zum PowerShell-Grundlagen

PowerShell 5.0: Paketverwaltung per PackageManagement

PowerShell-Cmdlets zur Verwaltung des SCVMM-Wartungsmodus

Folgen Sie SearchDataCenter.de auch auf Twitter, Google+, Xing und Facebook!

Erfahren Sie mehr über Containervirtualisierung