Установите RegistryValue в MSFT_NetAdapterAdvancedPropertySettingData - PullRequest
0 голосов
/ 08 ноября 2019

Мне нужно отключить дополнительные свойства энергосберегающего Ethernet и / или зеленого интернета для определенного сетевого адаптера. Это также должно работать на более старых версиях Windows (например, XP), поэтому я не могу использовать PowerShell для этого. Для целей этого вопроса будет работать изменение любого расширенного свойства посредством свойства RegistryValue (если это правильный способ сделать это).

Приведенный ниже код находит адаптер и свойство, которое мне нужно изменить, но всякий раз, когда я пытаюсь установить значение 0 (отключить), я получаю «Неверный параметр». Я уже успешно использую некоторые классы WMI (Win32_) и другие классы MSFT_, чтобы изменить некоторые вещи.

PutOptions options = new PutOptions();
options.Type = PutType.UpdateOnly;
oqPowerManagement = new ObjectQuery(
   "SELECT * FROM MSFT_NetAdapterAdvancedPropertySettingData " +
   "WHERE InstanceID like \"" + strNetworkAdapterId + ":%\"" +
   "  AND ElementName = \"Energy Efficient Ethernet\""
    );
mosPowerManagement = new ManagementObjectSearcher(msPowerManagement, oqPowerManagement);
ManagementObjectCollection mocPowerManagement = mosPowerManagement.Get();
ManagementObjectCollection.ManagementObjectEnumerator enumeratorPowerManagement = mocPowerManagement.GetEnumerator();
enumeratorPowerManagement.MoveNext();
ManagementObject moPowerManagementCurrent = (ManagementObject)enumeratorPowerManagement.Current;
//WriteLog(moPowerManagementCurrent.GetText(TextFormat.Mof));
PropertyData pdEnergyEfficientEthernet = moPowerManagementCurrent.Properties["RegistryValue"];
pdEnergyEfficientEthernet.Value = new String[] { "0" };
moPowerManagementCurrent.Put();

Я могу перейти непосредственно в реестр, но я пытаюсь избежать этого любой ценой.

Если я закомментирую строку, которая устанавливает значение, я все равно получу «Неверный параметр», который подразумевает, что он уже каким-то образом облажался. Если я уберу опцию put, я получу «Объект или свойство уже существует», подразумевая, что все это необходимо для создания новой записи, но она уже существует, но не уверена, что это мне что-то говорит.

Закомментированный WriteLog для вывода MOF выглядит хорошо, поэтому я знаю, что получаю правильный объект (см. Ниже).

MSFT_NetAdapterAdvancedPropertySettingData {
    Caption = "MSFT_NetAdapterAdvancedPropertySettingData 'Intel(R) Ethernet Connection (4) I219-LM'";
    DefaultDisplayValue = "On";
    DefaultRegistryValue = "1";
    Description = "Energy Efficient Ethernet";
    DisplayName = "Energy Efficient Ethernet";
    DisplayParameterType = 5;
    DisplayValue = "On";
    ElementName = "Energy Efficient Ethernet";
    InstanceID = "{3DC8718C-54AC-4DDC-B2C8-CF145CCCFAC4}::EEELinkAdvertisement";
    InterfaceDescription = "Intel(R) Ethernet Connection (4) I219-LM";
    Name = "My Network 11";
    Optional = FALSE;
    RegistryDataType = 1;
    RegistryKeyword = "EEELinkAdvertisement";
    RegistryValue = {"1"};
    Source = 3;
    SystemName = "XXX-XXX-XXXX-XXX";
    ValidDisplayValues = {"Off", "On"};
    ValidRegistryValues = {"0", "1"};
};

Если бы я не знал ничего лучшегоЯ думаю, что RegistryValue был только для чтения, но все, что я видел, говорит, что нет. (https://docs.microsoft.com/en-us/previous-versions/windows/desktop/netadaptercimprov/msft-netadapteradvancedpropertysettingdata)

Я могу прибегнуть к непосредственному обновлению реестра, но действительно стараюсь этого избежать, если это вообще возможно.

Спасибо за любой совет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...