2025-11-28 00:35:46 +09:00

149 lines
6.4 KiB
C#

// 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 Corporation. All rights reserved
namespace Microsoft.Samples.HyperV.FibreChannel
{
using System;
using System.Collections.Generic;
using System.Management;
using System.Globalization;
using Microsoft.Samples.HyperV.Common;
static class DeleteVirtualFcPortSample
{
/// <summary>
/// Removes a synthetic FC Adapter device of a virtual machine. Note that the virtual
/// machine must be in the power off state.
/// </summary>
/// <param name="virtualMachine">The name of the virtual machine.</param>
/// <param name="scope">The scope to use when connecting to WMI.</param>
/// <returns>A collection of Msvm_SyntheticFcPortSettingData instances.</returns>
private static string[]
GetResourcesToRemove(
ManagementObject managementService,
ManagementObject virtualMachine,
WorldWideName wwnA,
WorldWideName wwnB)
{
using (ManagementObject virtualMachineSettings =
WmiUtilities.GetVirtualMachineSettings(virtualMachine))
{
ManagementObjectCollection fcPortCollection = virtualMachineSettings.GetRelated(
"Msvm_SyntheticFcPortSettingData",
"Msvm_VirtualSystemSettingDataComponent",
null, null, null, null, false, null);
List<string> portsToRemove = new List<string>();
foreach (ManagementObject fcPort in fcPortCollection)
{
string primaryWwpn = fcPort["VirtualPortWWPN"].ToString();
string primaryWwnn = fcPort["VirtualPortWWNN"].ToString();
string secondaryWwpn = fcPort["SecondaryWWPN"].ToString();
string secondaryWwnn = fcPort["SecondaryWWNN"].ToString();
if (string.Equals(primaryWwpn, wwnA.PortName, StringComparison.OrdinalIgnoreCase) &&
string.Equals(primaryWwnn, wwnA.NodeName, StringComparison.OrdinalIgnoreCase) &&
string.Equals(secondaryWwpn, wwnB.PortName, StringComparison.OrdinalIgnoreCase) &&
string.Equals(secondaryWwnn, wwnB.NodeName, StringComparison.OrdinalIgnoreCase))
{
portsToRemove.Add(fcPort.Path.Path);
}
}
return portsToRemove.ToArray();
}
}
/// <summary>
/// Deletes virtual FC ports, specified by the two sets of WorldWideNames, for a particular VM.
/// </summary>
/// <param name="virtualMachineName">Name of the VM whose virtual FC Ports we want to delete</param>
/// <param name="wwnA">Virtual Port WWN</param>
/// <param name="wwnB">Secondary WWN.</param>
private static void
DeleteVirtualFcPort(
string virtualMachineName,
WorldWideName wwnA,
WorldWideName wwnB)
{
Console.WriteLine("Removing virtual FC port(s) with following WWNs from VM {0}:", virtualMachineName);
Console.WriteLine("\tVirtualPortWWPN {0}, VirtualPortWWNN {1}", wwnA.PortName, wwnA.NodeName);
Console.WriteLine("\tSecondaryWWPN {0}, SecondaryWWNN {1}", wwnB.PortName, wwnB.NodeName);
ManagementScope scope = FibreChannelUtilities.GetFcScope();
using (ManagementObject managementService =
WmiUtilities.GetVirtualMachineManagementService(scope))
//
// Find the virtual machine we want to connect.
//
using (ManagementObject virtualMachine =
WmiUtilities.GetVirtualMachine(virtualMachineName, scope))
{
string[] portsToRemove = GetResourcesToRemove(managementService,
virtualMachine,
wwnA,
wwnB);
if (portsToRemove.Length == 0)
{
Console.WriteLine("The specified world wide names were not found in VM {0}", virtualMachineName);
return;
}
using (ManagementBaseObject inParams =
managementService.GetMethodParameters("RemoveResourceSettings"))
{
inParams["ResourceSettings"] = portsToRemove;
using (ManagementBaseObject addAdapterOutParams =
managementService.InvokeMethod("RemoveResourceSettings",
inParams,
null))
{
WmiUtilities.ValidateOutput(addAdapterOutParams, scope, true, true);
}
}
}
Console.WriteLine("Successfully deleted the virtual FC port on VM {0}.", virtualMachineName);
}
/// <summary>
/// Entry point for the DeleteVirtualFcPort sample.
/// </summary>
/// <param name="args">The command line arguments.</param>
internal static void
ExecuteSample(
string[] args)
{
if (args.Length != 5 || (args.Length > 0 && args[0] == "/?"))
{
Console.WriteLine("Usage: DeleteVirtualFcPort <VM Name> <WWPN-A> <WWNN-A> <WWPN-B> <WWNN-B>");
return;
}
try
{
WorldWideName wwnA = new WorldWideName();
wwnA.PortName = args[1];
wwnA.NodeName = args[2];
WorldWideName wwnB = new WorldWideName();
wwnB.PortName = args[3];
wwnB.NodeName = args[4];
DeleteVirtualFcPort(args[0], wwnA, wwnB);
}
catch (Exception ex)
{
Console.WriteLine("Failed to delete virtual FC port. Error message details:\n");
Console.WriteLine(ex.Message);
}
}
}
}