![](https://www.computerweekly.com/visuals/German/article/automation-cogs-1-fotolia_searchsitetablet_520X173.jpg)
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.
![](https://cdn.ttgtmedia.com/rms/editorial/sServerVirtualization_FigureA_121616_mobile.png)
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.](https://cdn.ttgtmedia.com/rms/editorial/sServerVirtualization_FigureB_121616_mobile.png)
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.](https://cdn.ttgtmedia.com/rms/editorial/sServerVirtualization_FigureC_121616_mobile.png)
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!