// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF // ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO // THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A // PARTICULAR PURPOSE. // // Copyright (c) Microsoft. All rights reserved. namespace Microsoft.Samples.HyperV.Generation2VM { using System; using System.Globalization; using System.Management; using Microsoft.Samples.HyperV.Common; static class Generation2VMSetBootOrderSample { /// /// Set the boot order for a VM. /// /// The name of the server on which to perform the action. /// The name of the VM on which to set boot order. /// The boot order entry to move to the head of the boot order list. internal static void SetGeneration2BootOrder( string serverName, string vmName, string first) { ManagementScope scope = new ManagementScope(@"\\" + serverName + @"\root\virtualization\v2", null); using (ManagementObject vm = WmiUtilities.GetVirtualMachine(vmName, scope)) using (ManagementObject vmSettings = WmiUtilities.GetVirtualMachineSettings(vm)) { string virtualSystemSubType = (string)vmSettings["VirtualSystemSubType"]; if (!string.Equals(virtualSystemSubType, "Microsoft:Hyper-V:SubType:2", StringComparison.OrdinalIgnoreCase)) { Console.WriteLine("VM {0} on server {1} is not generation 2", vmName, serverName); return; } string[] prevBootOrder = (string[])vmSettings["BootSourceOrder"]; string[] newBootOrder = new string[prevBootOrder.Length]; // // Rebuild the order with the specified entry first // int index = 1; foreach (string entry in prevBootOrder) { ManagementPath entryPath = new ManagementPath(entry); using (ManagementObject entryObject = new ManagementObject(entryPath)) { string entryDevicePath = entryObject["FirmwareDevicePath"].ToString(); if (string.Equals(first, entryDevicePath, StringComparison.OrdinalIgnoreCase)) { newBootOrder[0] = entry; } else { newBootOrder[index++] = entry; } } } // // Modify the virtual system to use the new order. // vmSettings["BootSourceOrder"] = newBootOrder; using (ManagementObject service = WmiUtilities.GetVirtualMachineManagementService(scope)) using (ManagementBaseObject inParams = service.GetMethodParameters("ModifySystemSettings")) { inParams["SystemSettings"] = vmSettings.GetText(TextFormat.WmiDtd20); using (ManagementBaseObject outParams = service.InvokeMethod("ModifySystemSettings", inParams, null)) { WmiUtilities.ValidateOutput(outParams, scope, true, true); } Console.WriteLine("Successfully modified boot order"); return; } } } } }