Получайте только IPv4-адреса и исключайте IPv6 из WMI PHP

У меня есть скрипт для получения IP-адреса на основе PHP и WMI, например:

Получить активную сеть адаптера

function get_server_network_adapter() {

    $pc = "."; 
    $obj = new COM ("winmgmts:\\\\".$pc."\\root\\cimv2");
    $wmi_network_rec = $obj->ExecQuery("Select * from  Win32_NetworkAdapter Where NetConnectionStatus = 2");

    foreach ($wmi_network_rec as $wmi_call) {
        $adapter = $wmi_call->Name;
        return $adapter;
    }
}

и получите IP-адрес активного адаптера

function get_server_ip() 
{
    $adapter = get_server_network_adapter();
    $pc = "."; 
    $obj = new COM ("winmgmts:\\\\".$pc."\\root\\cimv2");
    $wmi_server_ip = $obj->ExecQuery("Select * from  Win32_NetworkAdapterConfiguration Where Description = '$adapter'");

    foreach ($wmi_server_ip as $wmi_call) {
        $ip = $wmi_call->IPAddress;

        foreach ($ip as $key => $value) {
            echo $value;
        }
    }
}

Результат моего кода выше 192.168.1.103fe80::e9ad:9bb:e359:a122

Однако я хочу получить IPv4 только как 192.168.1.103

Кто-нибудь может мне помочь? Спасибо

1 ответ

Абстрагироваться от php тег, IPAddress Свойство просто массив на любом используемом языке. Прочтите об этом в статье MSDN Win32_NetworkAdapterConfiguration class:

Айпи адрес

Тип данных: строковый массив
Тип доступа: только для чтения
Классификаторы: MappingStrings
("Win32Registry | System \ CurrentControlSet \ Services | Parameters \ Tcpip | IPAddress")

Массив всех IP-адресов, связанных с текущим сетевым адаптером. Это свойство может содержать адреса IPv6 или IPv4. Для получения дополнительной информации см. Поддержка IPv6 и IPv4 в WMI.

Однако (выше вашего вопроса), определение сетевого адаптера через Name или же Descriptionсобственность не кажется хорошей идеей. использованиеInterfaceIndex собственность вместо Прочитайте статьи Win32_NetworkAdapterConfiguration и статьи MSDN класса Win32_NetworkAdapter:

InterfaceIndex

Тип данных: uint32
Тип доступа: только для чтения

Значение индекса, которое однозначно определяет интерфейс локальной сети. Значение в этом свойстве совпадает со значением в InterfaceIndex свойство в экземпляре Win32_IP4RouteTable, представляющее сетевой интерфейс в таблице маршрутов.

Другие вопросы по тегам