// 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.Networking
{
using System;
using System.Management;
using System.Globalization;
using Microsoft.Samples.HyperV.Common;
static class ManageExtensionSample
{
const UInt16 CimEnabledStateEnabled = 2;
const UInt16 CimEnabledStateDisabled = 3;
const UInt16 CimEnabledStateNotApplicable = 5;
///
/// Modifies the name and notes of an existing switch. We also show how to modify the
/// IOVPreferred property.
///
/// The name of the switch on which the extension will be enabled or disabled.
/// The name of the extension to enable or disable.
/// The new enabled state of the extension.
static void
SetExtensionEnabledState(
string switchName,
string extensionName,
bool enabled)
{
bool found = false;
ManagementScope scope = new ManagementScope(@"root\virtualization\v2");
//
// Get the switch we want to modify.
//
using (ManagementObject ethernetSwitch = NetworkingUtilities.FindEthernetSwitch(switchName, scope))
//
// To make modifications to the switch, we need to modify its configuration object.
//
using (ManagementObjectCollection extensions = ethernetSwitch.GetRelated(
"Msvm_EthernetSwitchExtension",
"Msvm_HostedEthernetSwitchExtension",
null,
null,
null,
null,
false,
null))
{
foreach (ManagementObject extension in extensions)
using (extension)
{
if (!String.Equals(
(string)extension["ElementName"],
extensionName,
StringComparison.OrdinalIgnoreCase))
{
continue;
}
found = true;
if ((UInt16)extension["EnabledState"] == CimEnabledStateNotApplicable)
{
Console.WriteLine("The enabled state of the specified extension cannot be changed.");
continue;
}
if (((UInt16)extension["EnabledState"] == CimEnabledStateEnabled) && enabled)
{
Console.WriteLine("The specified extension is already enabled.");
continue;
}
if (((UInt16)extension["EnabledState"] == CimEnabledStateDisabled) && !enabled)
{
Console.WriteLine("The specified extension is already disabled.");
continue;
}
using (ManagementBaseObject inParams = extension.GetMethodParameters("RequestStateChange"))
{
inParams["RequestedState"] = enabled ? CimEnabledStateEnabled : CimEnabledStateDisabled;
using (ManagementBaseObject outParams =
extension.InvokeMethod("RequestStateChange", inParams, null))
{
WmiUtilities.ValidateOutput(outParams, scope);
Console.WriteLine(string.Format(
CultureInfo.CurrentCulture,
"Extension '{0}' was successfully {1} on switch '{2}'.",
extensionName,
enabled ? "enabled" : "disabled",
switchName));
}
}
}
}
if (!found)
{
throw new ApplicationException(String.Format(
CultureInfo.CurrentCulture,
"Could not find extension '{0}' on switch '{1}'.",
extensionName,
switchName));
}
}
static void
MoveExtension(
string switchName,
string extensionName,
int offset)
{
ManagementScope scope = new ManagementScope(@"root\virtualization\v2");
//
// Get the switch we want to modify.
//
using (ManagementObject ethernetSwitch = NetworkingUtilities.FindEthernetSwitch(switchName, scope))
//
// To make modifications to the switch, we need to modify its configuration object.
//
using (ManagementObject ethernetSwitchSettings = WmiUtilities.GetFirstObjectFromCollection(
ethernetSwitch.GetRelated("Msvm_VirtualEthernetSwitchSettingData",
"Msvm_SettingsDefineState",
null, null, null, null, false, null)))
{
string[] extensionOrder = (string[])ethernetSwitchSettings["ExtensionOrder"];
byte[] extensionTypes = new byte[extensionOrder.Length];
int extensionIndex = -1;
for (int idx = 0; idx < extensionOrder.Length; ++idx)
{
using (ManagementObject extension = new ManagementObject(extensionOrder[idx]))
{
extension.Get();
extensionTypes[idx] = (byte)extension["ExtensionType"];
if (String.Equals(
(string)extension["ElementName"],
extensionName,
StringComparison.OrdinalIgnoreCase))
{
extensionIndex = idx;
}
}
}
if (extensionIndex == -1)
{
throw new ApplicationException(String.Format(
CultureInfo.CurrentCulture,
"Could not find extension '{0}' on switch '{1}'.",
extensionName,
switchName));
}
//
// Ensure that this is a valid move operation. The new extension index must
// be in range, and the extension cannot be interleaved with other extensions of
// a different type.
//
int newExtensionIndex = extensionIndex + offset;
if ((newExtensionIndex < 0) || (newExtensionIndex >= extensionOrder.Length))
{
throw new ApplicationException("Invalid move operation.");
}
if (extensionTypes[newExtensionIndex] != extensionTypes[extensionIndex])
{
throw new ApplicationException("Invalid move operation.");
}
//
// Reorder the extensions and apply the switch settings changes.
//
string temp = extensionOrder[newExtensionIndex];
extensionOrder[newExtensionIndex] = extensionOrder[extensionIndex];
extensionOrder[extensionIndex] = temp;
ethernetSwitchSettings["ExtensionOrder"] = extensionOrder;
using (ManagementObject switchService = NetworkingUtilities.GetEthernetSwitchManagementService(scope))
using (ManagementBaseObject inParams = switchService.GetMethodParameters("ModifySystemSettings"))
{
inParams["SystemSettings"] = ethernetSwitchSettings.GetText(TextFormat.WmiDtd20);
using (ManagementBaseObject outParams =
switchService.InvokeMethod("ModifySystemSettings", inParams, null))
{
WmiUtilities.ValidateOutput(outParams, scope);
}
}
}
Console.WriteLine(string.Format(
CultureInfo.CurrentCulture,
"Extension '{0}' was successfully reordered on switch '{1}'.",
extensionName,
switchName));
}
///
/// Displays usage information for this sample.
///
internal static void
ShowUsage()
{
Console.WriteLine(
"Usage: ManageExtension SwitchName ExtensionName (Enable/Disable/MoveUp/MoveDown)\n" +
"\n" +
"Example: ManageExtension MySwitch \"NDIS Capture LightWeight Filter\" Enable");
}
///
/// Entry point for the ManageExtension sample.
///
/// The command line arguments.
internal static void
ExecuteSample(
string[] args)
{
if ((args.Length != 3) || (args.Length > 0 && args[0] == "/?"))
{
ShowUsage();
return;
}
try
{
string switchName = args[0];
string extensionName = args[1];
string operation = args[2].ToLowerInvariant();
switch (operation)
{
case "enable":
SetExtensionEnabledState(switchName, extensionName, true);
break;
case "disable":
SetExtensionEnabledState(switchName, extensionName, false);
break;
case "moveup":
MoveExtension(switchName, extensionName, -1);
break;
case "movedown":
MoveExtension(switchName, extensionName, 1);
break;
default:
ShowUsage();
break;
}
}
catch (Exception ex)
{
Console.WriteLine("Failed to modify switch extension. Error message details:\n");
Console.WriteLine(ex.Message);
}
}
}
}