向Hyper-v交换机端口添加(扩展)ACL规则

时间:2018-10-23 15:06:57

标签: c# .net wmi hyper-v

要远程管理多个Hyper-V节点,我正在实现WMI。

大多数Hyper-V功能已经可以使用:创建,删除计算机,网络适配器等。但是我似乎无法弄清楚为什么添加扩展的ACL规则将行不通。令我惊讶的是,我对此感到惊讶。

错误消息:“在交换机“自定义交换机”上应用交换机端口设置“以太网交换机端口扩展ACL设置”时失败:一个或多个参数无效(0x80070057)”,我无法弄清楚论点。

如果我使用Powershell等效的“ add-VMNetworkAdapterExtendedAcl”,就没有问题。我知道常数,例如每个扩展acl的唯一权重。

Msvm_VirtualSystemManagementService对象中的AddFeatureSettings方法仅需要两个参数AffectedConfiguration和FeatureSettings。如果第一个包含无效的引用,则会收到另一个错误,如果FeatureSettings不是字符串数组,则同样适用。因此,字符串数组的内容似乎是问题所在。奇怪的是,尽管ModifyFeatureSettings也不起作用,但我可以通过RemoveFeatureSettings方法删除现有的扩展ACL规则...

字符串数组应包含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 个答案:

没有答案