modules/VMSettings.psm1

Set-StrictMode -Version "Latest"


function Get-VMSettings {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
        [HyperV.Tools.VM]
        [Alias("VM")]
            $InputObject
    )

    $VM = $InputObject

    $VM_settings = Get-CimInstance -Namespace "root\virtualization\v2" -Class "Msvm_VirtualSystemSettingData" -Filter "ConfigurationID='$($VM.Id)'"

    return $VM_settings
}

function Set-VMSettings {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true)]
        [CimInstance]
        [ValidateCimInstance("Msvm_VirtualSystemSettingData", "root\virtualization\v2")]
            $VMSettings
    )

    $CIM_serializer = [Microsoft.Management.Infrastructure.Serialization.CimSerializer]::Create()
    $VM_settings_serialized = $CIM_serializer.Serialize($VMSettings, [Microsoft.Management.Infrastructure.Serialization.InstanceSerializationOptions]::None)
    $VM_settings_as_XML = [System.Text.Encoding]::Unicode.GetString($VM_settings_serialized)

    $mgmt_svc = Get-CimInstance -Class "Msvm_VirtualSystemManagementService" -Namespace "root\virtualization\v2"

    Invoke-CimMethod -CimInstance $mgmt_svc -MethodName "ModifySystemSettings" -Arguments @{ "SystemSettings" = $VM_settings_as_XML } | Out-Null
}