Для удаленного управления несколькими узлами Hyper-V я использую WMI.
Большинство функций Hyper-V уже работают: создавать, удалять компьютеры, сетевой адаптер и многое другое.Но я не могу понять, почему добавление расширенных правил ACL не будет работать.Я весьма удивлен тем, как мало я могу найти по этому вопросу.
В сообщении об ошибке говорится: «Ошибка при применении настроек порта коммутатора« Настройки расширенного ACL порта коммутатора Ethernet »на коммутаторе« Пользовательский коммутатор »: один или несколько аргументов».недопустимы (0x80070057) ", и я не могу понять, что не так с аргументом.
Если я использую эквивалент PowerShell" add-VMNetworkAdapterExtendedAcl ", это не проблема.Мне известны такие константы, как уникальные веса для каждого расширенного acl.
Для метода AddFeatureSettings в объекте Msvm_VirtualSystemManagementService требуются только два параметра: ActedConfiguration и FeatureSettings.Если первый содержит недопустимую ссылку, я получаю другую ошибку, то же самое применяется, когда FeatureSettings не является массивом строк.Таким образом, содержимое массива строк кажется проблемой.Странно то, что хотя ModifyFeatureSettings тоже не работает, я могу удалить существующие расширенные правила ACL с помощью метода RemoveFeatureSettings ...
Массив строк должен содержать текстовое представление объекта Msvm_EthernetSwitchPortFeatureSettingData.В этом случае объект Msvm_EthernetSwitchPortExtendedAclSettingData.
Это моя демонстрационная программа для расширенного правила ACL:
var defaultFeatureSetting = new ManagementObject(<path to default extended acl definition>)
defaultFeatureSetting["Direction"] = 1;
defaultFeatureSetting["Weight"] = 1;
...
Как передать расширенное правило ACL:
using (ManagementBaseObject inParams = managementService.GetMethodParameters("AddFeatureSettings"))
{
inParams["AffectedConfiguration"] = ethernetConnectionSetting.Path.Path;
inParams["FeatureSettings"] = new string[] { defaultFeatureSetting.GetText(TextFormat.WmiDtd20) };
using (ManagementBaseObject outParams = managementService.InvokeMethod("AddFeatureSettings", inParams, null))
{
var code = outParams["ReturnValue"];
var jobStr = outParams["Job"] as String;
if (jobStr != null)
{
var job = new ManagementObject(jobStr);
var error = (UInt16)job["ErrorCode"];
var error1 = job["ErrorDescription"] as String;
var error2 = job["ErrorSummaryDescription"] as String;
Console.WriteLine("Error: {0}: {1} [{2}]", error, error1, error2);
}
}
}