Назначьте vlan сетевому адаптеру через классы wmi - PullRequest
2 голосов
/ 13 апреля 2019

Проблема: Не удается назначить vlan виртуальной машине hyper-v с помощью Msvm_VirtualEthernetSwitchManagementService и метода AddFeatureSettings.

Может кто-то указать мне, что я делаю неправильно?

Также я заметил, что если я использую классы WMI для создания vNIC, я не получаю экземпляр Msvm_EthernetPortAllocationSettingData, но если я назначаю vNIC вручную, он создается .. У меня проблемы с созданием Msvm_EthernetPortAllocationSettingData через WMI также.

Из приведенного ниже кода я получаю значение ReturnValue, равное 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);

1 Ответ

0 голосов
/ 15 апреля 2019

После экспериментов я нашел ответ.Вам нужно создать (или указать на него, если он у вас уже есть) экземпляр Msvm_EthernetPortAllocationSettingData с Msvm_VirtualSystemManagementService , используя метод «AddResourceSettings».

Чтобы использовать метод «AddResourceSettings», вам необходимо определить:

  • Свойство ActedConfiguration, которое является экземпляром Msvm_VirtualSystemSettingData class
  • ResourceSettingsсвойство, которое является экземпляром Msvm_EthernetPortAllocationSettingData , но вам нужно поместить этот экземпляр в массив.

Теперь вы готовы назначить vlan.Вам нужно будет создать экземпляр Msvm_EthernetSwitchPortVlanSettingData с Msvm_VirtualSystemManagementService и методом «AddFeatureSettings».

Чтобы использовать метод «AddFeatureSettings», вам потребуется 10: вам потребуется:

  • ActedConfiguration, которая является экземпляром Msvm_EthernetPortAllocationSettingData
  • FeatureSettings, который является экземпляром Msvm_EthernetSwitchPortVlanSettingData
34, который равен 10 10 * *, что равно*

И это то, что ..

Ура!

...