Мне нужно отключить дополнительные свойства энергосберегающего 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)
Я могу прибегнуть к непосредственному обновлению реестра, но действительно стараюсь этого избежать, если это вообще возможно.
Спасибо за любой совет.