通过wmi类将vlan分配给网络适配器

问题描述 投票:2回答:1

问题:无法使用Msvm_VirtualEthernetSwitchManagementService和AddFeatureSettings方法将vlan分配给hyper-v虚拟机。

有人能指出我做错了什么吗?

另外我注意到如果我使用WMI类来创建vNIC我没有得到Msvm_EthernetPortAllocationSettingData的实例,但是如果我手动分配vNIC它就会被创建..我也无法通过WMI创建Msvm_EthernetPortAllocationSettingData。

从下面的代码我得到的返回值为4096,这意味着该方法已被执行..但没有分配任何vlan。

            ManagementPath syntheticAdapterSettingDataC = new ManagementPath("Msvm_EthernetSwitchPortVlanSettingData");
            String syntheticVlanAdapterId = String.Format("{0}\\C\\952C5004-4465-451C-8CB8-FA9AB382B773\\{1}", adapter.GetPropertyValue("InstanceID"), Guid.NewGuid());

            ManagementClass syntheticAdapterClassC =
               new ManagementClass(scope, syntheticAdapterSettingDataC, objectOptions)
               {
                   ["AccessVlanId"] = 55,
                   ["Caption"] = "Ethernet Switch Port VLAN Settings",
                   ["Description"] = "Represents the vlan setting data.",
                   ["ElementName"] = "Ethernet Switch Port VLAN Settings",
                   ["InstanceID"] = syntheticVlanAdapterId,
                   ["NativeVlanId"] = 0,
                   ["OperationMode"] = 1,
                   ["PrimaryVlanId"] = 0,
                   ["PruneVlanIdArray"] = null,
                   ["PvlanMode"] = 0,
                   ["SecondaryVlanId"] = 0,
                   ["SecondaryVlanIdArray"] = null,
                   ["TrunkVlanIdArray"] = null,
               };
            var syntheticAdapterC = syntheticAdapterClassC.CreateInstance();

            ManagementPath VirtualEthernetSwitchManagementServicePath= new ManagementPath("Msvm_VirtualEthernetSwitchManagementService");
            ManagementClass VirtualEthernetSwitchManagementServiceClass = new ManagementClass(scope, VirtualEthernetSwitchManagementServicePath, objectOptions);

            ManagementBaseObject inParams = VirtualEthernetSwitchManagementServiceClass.GetMethodParameters("AddFeatureSettings");


            string queryFeature = string.Format("select * from Msvm_FeatureSettingData Where InstanceID = 'Microsoft:Definition\\\\952C5004-4465-451C-8CB8-FA9AB382B773\\\\Default'");

            ManagementObjectSearcher searcherFeature = new ManagementObjectSearcher(scope, new ObjectQuery(queryFeature));

            ManagementObjectCollection features = searcherFeature.Get();

            ManagementObject feature = null;

            foreach (ManagementObject instance in features)
            {
                feature = instance;
                break;
            }

            string[] syntheticAdapterSettingsC = new string[1];
            syntheticAdapterSettingsC[0] = syntheticAdapterC.GetText(TextFormat.CimDtd20);



            inParams["AffectedConfiguration"] = feature.GetText(TextFormat.CimDtd20);

            inParams["FeatureSettings"] = syntheticAdapterSettingsC;

            ManagementObject service = null;

            foreach (ManagementObject instance in VirtualEthernetSwitchManagementServiceClass.GetInstances())
            {
                service = instance;
            }

            ManagementBaseObject vlanOut = service.InvokeMethod("AddFeatureSettings", inParams, null);
c# wmi hyper-v
1个回答
0
投票

经过实验,我找到了答案。您需要做的是使用“AddResourceSettings”方法使用Msvm_VirtualSystemManagementService类创建(或指向一个已经存在的实例)Msvm_EthernetPortAllocationSettingData实例。

要使用“AddResourceSettings”方法,您需要定义:

  • AffectedConfiguration属性,它是Msvm_VirtualSystemSettingData类的实例
  • ResourceSettings属性,它是Msvm_EthernetPortAllocationSettingData的一个实例,但您需要将此实例放在数组中。

现在你准备好分配vlan了。您需要使用Msvm_VirtualSystemManagementService类和“AddFeatureSettings”方法创建Msvm_EthernetSwitchPortVlanSettingData的实例。

要使用“AddFeatureSettings”方法,您需要定义:

  • AffectedConfiguration,它是Msvm_EthernetPortAllocationSettingData的一个实例
  • FeatureSettings,它是Msvm_EthernetSwitchPortVlanSettingData的一个实例,它也是数组

那就是..

干杯!

© www.soinside.com 2019 - 2024. All rights reserved.