Scripting dynamic memory, part 1: reading the configuration
With the availability of dynamic memory in Windows Server 2008 R2 SP1 there are some changes to how you need to handle memory as a scripter / developer. The WMI API changes are now documented here https://msdn.microsoft.com/en-us/library/cc136856(VS.85).aspx
Most of the changes are fairly obvious – but two not so obvious properties are the properties for the “Startup RAM” and “Maximum RAM”. In WMI these are mapped to “VirtualQuantity” and “Limit” respectively. Here is a sample script that simply displays the memory configuration of the specified virtual machine:
# Prompt for the Hyper-V Server to use
$HyperVServer = Read-Host "Specify the Hyper-V Server to use (enter '.' for the local computer)"
# Prompt for the virtual machine to use
$VMName = Read-Host "Specify the name of the virtual machine"
# Get the management service
$VMMS = gwmi -namespace root\virtualization Msvm_VirtualSystemManagementService -computername $HyperVServer
# Get the virtual machine object
$VM = gwmi MSVM_ComputerSystem -filter "ElementName='$VMName'" -namespace "root\virtualization" -computername $HyperVServer
# SettingType = 3 ensures that we do not get snapshots
$SystemSettingData = $VM.getRelated("Msvm_VirtualSystemSettingData") | where {$_.SettingType -eq 3}
# Get the Memory setting data
$MemSetting = $SystemSettingData.getRelated("Msvm_MemorySettingData") | select -first 1
# Display information about the current memory configuration
switch ($MemSetting.DynamicMemoryEnabled)
{
True {# Dynamic memory is enabled
write-host
write-host "Dynamic memory is enabled."
write-host
write-host "Startup Memory: " $MemSetting.VirtualQuantity $MemSetting.AllocationUnits
write-host "Maximum Memory: " $MemSetting.Limit $MemSetting.AllocationUnits
write-host "Memory buffer: " $MemSetting.TargetMemoryBuffer
write-host "Weight: " $MemSetting.Weight}
False {# Dynamic memory is disabled
write-host
write-host "Dynamic memory is disabled."
write-host
write-host "Memory: " $MemSetting.VirtualQuantity $MemSetting.AllocationUnits
write-host "Weight: " $MemSetting.Weight}
}
Cheers,
Ben