Добавление (расширенных) правил ACL к портам коммутатора Hyper-v

Для удаленного управления несколькими узлами Hyper-V я использую WMI.

Большинство функций Hyper-V уже работают: создавать, удалять компьютеры, сетевой адаптер и многое другое. Но я не могу понять, почему добавление расширенных правил ACL не будет работать. Я весьма удивлен, как мало я могу найти по этому вопросу.

В сообщении об ошибке говорится: "Ошибка при применении настроек порта коммутатора" Расширенные настройки ACL порта коммутатора Ethernet "на коммутаторе" Пользовательский коммутатор ": один или несколько аргументов недействительны (0x80070057)", и я не могу понять, что не так с аргументом.

Если я использую эквивалент PowerShell "add-VMNetworkAdapterExtendedAcl", это не проблема. Мне известны такие константы, как уникальные веса для каждого расширенного acl.

Для метода AddFeatureSettings в объекте Msvm_VirtualSystemManagementService требуются только два параметра AfferedConfiguration и 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);
        }
    }
}

0 ответов

Другие вопросы по тегам