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())); }
RemoveFeatureSettings( string virtualMachineName, NetworkingUtilities.PortFeatureType featureType) { ManagementScope scope = new ManagementScope(@"root\virtualization\v2"); int connectionsCount = 0; 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)) { string featureSettingClass; switch (featureType) { case NetworkingUtilities.PortFeatureType.Security: featureSettingClass = "Msvm_EthernetSwitchPortSecuritySettingData"; break; case NetworkingUtilities.PortFeatureType.Offload: featureSettingClass = "Msvm_EthernetSwitchPortOffloadSettingData"; break; case NetworkingUtilities.PortFeatureType.Acl: featureSettingClass = "Msvm_EthernetSwitchPortAclSettingData"; break; default: throw new ArgumentOutOfRangeException(featureType.ToString()); } connectionsCount = connections.Count; // // Now find the feature setting data object associated with each connection, if any. // try { foreach (ManagementObject ethernetConnectionSetting in connections) { List<string> featureSettingPaths = new List<string>(); using (ManagementObjectCollection featureSettingCollection = ethernetConnectionSetting.GetRelated(featureSettingClass, "Msvm_EthernetPortSettingDataComponent", null, null, null, null, false, null)) { if (featureSettingCollection.Count == 0) { continue; } foreach (ManagementObject featureSetting in featureSettingCollection) using (featureSetting) { featureSettingPaths.Add(featureSetting.Path.Path); } } using (ManagementBaseObject inParams = managementService.GetMethodParameters("RemoveFeatureSettings")) { // // We specify which feature setting to remove by giving the WMI path to the feature setting object. // inParams["FeatureSettings"] = featureSettingPaths.ToArray(); using (ManagementBaseObject outParams = managementService.InvokeMethod("RemoveFeatureSettings", 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}' to remove advanced {2} settings from " + "each of its {1} connection(s).", virtualMachineName, connectionsCount, featureType.ToString())); }
ModifyFeatureSettings( string virtualMachineName, NetworkingUtilities.PortFeatureType featureType) { ManagementScope scope = new ManagementScope(@"root\virtualization\v2"); int connectionsCount = 0; using (ManagementObject managementService = WmiUtilities.GetVirtualMachineManagementService(scope)) // // Find the virtual machine we want to modify the connections of. // using (ManagementObject virtualMachine = WmiUtilities.GetVirtualMachine(virtualMachineName, scope)) // // Find all connections for the given virtual machine. // using (ManagementObjectCollection connections = NetworkingUtilities.FindConnections( virtualMachine, scope)) { connectionsCount = connections.Count; // // Now find the security feature setting data object associated with each connection, if any. // try { string featureClassName; switch (featureType) { case NetworkingUtilities.PortFeatureType.Security: featureClassName = "Msvm_EthernetSwitchPortSecuritySettingData"; break; case NetworkingUtilities.PortFeatureType.Offload: featureClassName = "Msvm_EthernetSwitchPortOffloadSettingData"; break; default: throw new ArgumentOutOfRangeException(featureType.ToString()); } foreach (ManagementObject ethernetConnectionSetting in connections) { using (ManagementObjectCollection featureSettingCollection = ethernetConnectionSetting.GetRelated(featureClassName, "Msvm_EthernetPortSettingDataComponent", null, null, null, null, false, null)) { // // For the security/offload feature, each connection can have no more than one instance // of the feature setting, so we can simply take the first feature setting associated // with each connection. For other features, it may be necessary to do extra work. // if (featureSettingCollection.Count == 0) { continue; } string featureText; using (ManagementObject featureSetting = WmiUtilities.GetFirstObjectFromCollection(featureSettingCollection)) { switch (featureType) { case NetworkingUtilities.PortFeatureType.Security: // // Modify the feature setting's properties. Here, we enable MAC spoofing. // featureSetting["AllowMacSpoofing"] = true; break; case NetworkingUtilities.PortFeatureType.Offload: // // Modify the feature setting's properties. Here, we modify IOVQueuePairsRequested. // featureSetting["IOVQueuePairsRequested"] = 2; break; } featureText = featureSetting.GetText(TextFormat.WmiDtd20); } // Now apply the changes to the Hyper-V server. using (ManagementBaseObject inParams = managementService.GetMethodParameters("ModifyFeatureSettings")) { inParams["FeatureSettings"] = new string[] { featureText }; using (ManagementBaseObject outParams = managementService.InvokeMethod("ModifyFeatureSettings", 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 its advanced {2} settings modified.", virtualMachineName, connectionsCount, featureType.ToString())); }