ConnectVmToSwitch(
            string virtualMachineName,
            string switchName)
        {
            ManagementScope scope = new ManagementScope(@"root\virtualization\v2");

            using (ManagementObject managementService = WmiUtilities.GetVirtualMachineManagementService(scope))

                //
                // Find the Ethernet switch we want to connect to.
                //
                using (ManagementObject ethernetSwitch = NetworkingUtilities.FindEthernetSwitch(switchName, scope))

                    //
                    // Find the virtual machine we want to connect.
                    //
                    using (ManagementObject virtualMachine = WmiUtilities.GetVirtualMachine(virtualMachineName, scope))

                        //
                        // Get the virtual machine's settings object which is used to make configuration changes.
                        //
                        using (ManagementObject virtualMachineSettings = WmiUtilities.GetVirtualMachineSettings(virtualMachine))

                            //
                            // Add a new synthetic Network Adapter device to the virtual machine.
                            //
                            using (ManagementObject syntheticAdapter = NetworkingUtilities.AddSyntheticAdapter(virtualMachine, scope))

                                //
                                // Now that we have added a network adapter to the virtual machine we can configure its
                                // connection settings.
                                //
                                using (ManagementObject connectionSettingsToAdd =
                                           NetworkingUtilities.GetDefaultEthernetPortAllocationSettingData(scope))
                                {
                                    connectionSettingsToAdd["Parent"]       = syntheticAdapter.Path.Path;
                                    connectionSettingsToAdd["HostResource"] = new string[] { ethernetSwitch.Path.Path };

                                    //
                                    // Now add the connection settings.
                                    //
                                    using (ManagementBaseObject addConnectionInParams =
                                               managementService.GetMethodParameters("AddResourceSettings"))
                                    {
                                        addConnectionInParams["AffectedConfiguration"] = virtualMachineSettings.Path.Path;
                                        addConnectionInParams["ResourceSettings"]      =
                                            new string[] { connectionSettingsToAdd.GetText(TextFormat.WmiDtd20) };

                                        using (ManagementBaseObject addConnectionOutParams =
                                                   managementService.InvokeMethod("AddResourceSettings", addConnectionInParams, null))
                                        {
                                            WmiUtilities.ValidateOutput(addConnectionOutParams, scope);
                                        }
                                    }
                                }

            Console.WriteLine(string.Format(CultureInfo.CurrentCulture,
                                            "Successfully connected virtual machine '{0}' to switch '{1}'.",
                                            virtualMachineName, switchName));
        }
        ConnectVmUsingResourcePool(
            string virtualMachineName,
            string resourcePoolName)
        {
            ManagementScope scope = new ManagementScope(@"root\virtualization\v2");

            using (ManagementObject managementService = WmiUtilities.GetVirtualMachineManagementService(scope))

                //
                // Find the virtual machine we want to connect.
                //
                using (ManagementObject virtualMachine = WmiUtilities.GetVirtualMachine(virtualMachineName, scope))

                    //
                    // As a sanity check, verify that the specified resource pool exists by querying for it.
                    //
                    using (ManagementObject resourcePool = WmiUtilities.GetResourcePool(
                               "33",
                               "Microsoft:Hyper-V:Ethernet Connection",
                               resourcePoolName,
                               scope))

                        //
                        // Get the virtual machine's settings object which is used to make configuration changes.
                        //
                        using (ManagementObject virtualMachineSettings = WmiUtilities.GetVirtualMachineSettings(virtualMachine))

                            //
                            // Add a new synthetic Network Adapter device to the virtual machine.
                            //
                            using (ManagementObject syntheticAdapter = NetworkingUtilities.AddSyntheticAdapter(virtualMachine, scope))

                                //
                                // Now that we have added a network adapter to the virtual machine, we can configure its
                                // connection settings.
                                //
                                using (ManagementObject connectionSettingsToAdd =
                                           NetworkingUtilities.GetDefaultEthernetPortAllocationSettingData(scope))
                                {
                                    connectionSettingsToAdd["Parent"] = syntheticAdapter.Path.Path;

                                    //
                                    // Rather than specifying which switch to connect to, we specify which pool to look in.
                                    //
                                    connectionSettingsToAdd["PoolId"] = resourcePoolName;

                                    //
                                    // Now add the connection settings.
                                    //
                                    using (ManagementBaseObject addConnectionInParams =
                                               managementService.GetMethodParameters("AddResourceSettings"))
                                    {
                                        addConnectionInParams["AffectedConfiguration"] = virtualMachineSettings.Path.Path;
                                        addConnectionInParams["ResourceSettings"]      =
                                            new string[] { connectionSettingsToAdd.GetText(TextFormat.WmiDtd20) };

                                        using (ManagementBaseObject addConnectionOutParams =
                                                   managementService.InvokeMethod("AddResourceSettings", addConnectionInParams, null))
                                        {
                                            WmiUtilities.ValidateOutput(addConnectionOutParams, scope);
                                        }
                                    }
                                }

            Console.WriteLine(string.Format(CultureInfo.CurrentCulture,
                                            "Successfully created dynamic connection from virtual machine '{0}' to resource pool '{1}'.",
                                            virtualMachineName, resourcePoolName));
        }