Добавление (расширенных) правил ACL к портам коммутатора Hyper-v - PullRequest
0 голосов
/ 23 октября 2018

Для удаленного управления несколькими узлами 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);
        }
    }
}
...