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.

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).

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.

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

Erfahren Sie mehr über Containervirtualisierung