Я пытаюсь написать программу, которая будет переключать IP-адрес выбранного адаптера по команде.
Для этого я использую функцию GetAdaptersInfo (), чтобы получить индекс адаптера и его контекст IP, а затем использую его для удаления текущего IP (через DeleteIPAddress (context)).
После этого новый IP-адрес будет вставлен через AddIPAddress ().
Проблема заключается в том, что вызов функции DeleteIPAddress завершается неудачно при попытке удалить IP-адрес «по умолчанию» (тот, который не установлен AddIPAddress ()), а вызов AddIPAddress перед удалением старого IP-адреса оставляет адаптеру два разных одновременных IP-адреса.
Функция DeleteIPAddress завершается с ошибкой 31 (подключенное к системе устройство не работает).
Есть ли другой способ успешно изменить IP-адрес на адаптере? Действительно ли DeleteIPAddress можно использовать без получения контекста от AddIPAddress?
Говорят, DeleteIPAddress удаляет адрес, ранее добавленный AddIPAddress 🙂
Я должен был сделать некоторые исследования по интересам и …
Есть недокументированные SetAdapterIPAddress
функция.
DWORD SetAdapterIpAddress( char *pszAdapGUID,
DWORD dwDHCP,
DWORD dwIP,
DWORD dwMask,
DWORD dwGateway );
Это может работать или нет 🙂
Также есть интерфейс WMI. Смотрите для Win32_NetworkAdapterConfiguration
учебный класс.
И есть записи в реестре Windows для IP-адреса NIC …
Я думаю, сложность заключается в наличии в Windows многих «внутренних» агентов конфигурации (DHCP, другие …), и все они являются внутренней частью ОС, а затем, когда они манипулируют IP-адресом, другие манипуляции вне элемента управления могут сломаться. работая из них. Также есть возможность назначить статический IP-адрес в Реестре, и он также не должен быть взломан. И тогда у вас действительно есть DeleteIPAddress, который вы ранее добавили … Я думаю, он предназначен для ваших собственных агентов динамической конфигурации …
Если вы не удовлетворены работой других агентов, вы должны отключить их (вместо того, чтобы манипулировать IP-адресом из-под контроля) … Или управлять им с помощью какого-то определенного API … Или установить статический IP …
Других решений пока нет …