Ejemplo n.º 1
0
        AddFeatureSettings(
            string virtualMachineName,
            NetworkingUtilities.PortFeatureType featureType)
        {
            ManagementScope scope            = new ManagementScope(@"root\virtualization\v2");
            int             connectionsCount = 0;
            string          featureId        = NetworkingUtilities.GetPortFeatureId(featureType);

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

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

                    //
                    // Find all connections for the given virtual machine.
                    //
                    using (ManagementObjectCollection connections = NetworkingUtilities.FindConnections(
                               virtualMachine, scope))

                        //
                        // Find the default feature setting for the specified feature type (e.g. Security or ACL).
                        //
                        using (ManagementObject defaultFeatureSetting =
                                   NetworkingUtilities.GetDefaultFeatureSetting(featureId, scope))
                        {
                            //
                            // Set the default feature setting's properties, which will differ depending on which type
                            // of feature setting it is.
                            //
                            switch (featureType)
                            {
                            case NetworkingUtilities.PortFeatureType.Security:
                                //
                                // For example, using a security feature setting, we can disallow MAC spoofing.
                                //
                                defaultFeatureSetting["AllowMacSpoofing"] = false;
                                break;

                            case NetworkingUtilities.PortFeatureType.Acl:
                                //
                                // For example, using an ACL feature setting, we can meter an IP range.
                                //

                                //
                                // Action may be 1 - Allow, 2 - Deny, or 3 - Meter. Here we set up a metering ACL.
                                //
                                defaultFeatureSetting["Action"] = 3;

                                //
                                // Direction may be 1 - Incoming or 2 - Outgoing. Here we set up an ACL on Outgoing traffic.
                                //
                                defaultFeatureSetting["Direction"] = 2;

                                //
                                // Applicability may be 1 - Local or 2 - Remote. Here we set up an ACL on the local endpoint.
                                //
                                defaultFeatureSetting["Applicability"] = 1;

                                //
                                // AclType may be 1 - MAC, 2 - IPv4, or 3 - IPv6. Here we set up an IPv4 ACL.
                                //
                                defaultFeatureSetting["AclType"]                   = 2;
                                defaultFeatureSetting["RemoteAddress"]             = "*.*";
                                defaultFeatureSetting["RemoteAddressPrefixLength"] = 32;
                                break;

                            case NetworkingUtilities.PortFeatureType.Offload:
                                //
                                // For example, using an Offload feature setting, we can enable IOV.
                                //
                                defaultFeatureSetting["IOVOffloadWeight"] = 100;
                                break;

                            default:
                                //
                                // Invalid featureType Argument
                                //
                                throw new ArgumentOutOfRangeException(featureType.ToString());
                            }
                            string defaultFeatureSettingText = defaultFeatureSetting.GetText(TextFormat.WmiDtd20);

                            connectionsCount = connections.Count;

                            //
                            // Now add the feature setting to each connection.
                            //
                            try
                            {
                                foreach (ManagementObject ethernetConnectionSetting in connections)
                                {
                                    using (ManagementBaseObject inParams =
                                               managementService.GetMethodParameters("AddFeatureSettings"))
                                    {
                                        inParams["AffectedConfiguration"] = ethernetConnectionSetting.Path.Path;
                                        inParams["FeatureSettings"]       = new string[] { defaultFeatureSettingText };

                                        using (ManagementBaseObject outParams =
                                                   managementService.InvokeMethod("AddFeatureSettings", inParams, null))
                                        {
                                            WmiUtilities.ValidateOutput(outParams, scope);
                                        }
                                    }
                                }
                            }
                            finally
                            {
                                // Dispose of the connections.
                                foreach (ManagementObject ethernetConnectionSetting in connections)
                                {
                                    ethernetConnectionSetting.Dispose();
                                }
                            }
                        }

            Console.WriteLine(string.Format(CultureInfo.CurrentCulture,
                                            "Successfully modified virtual machine '{0}' so that each of its {1} connection(s) " +
                                            "has an advanced {2} setting added.",
                                            virtualMachineName, connectionsCount, featureType.ToString()));
        }