从WMI PHP获取仅IPV4地址和排除IPv6

时间:2016-04-02 11:15:23

标签: php wmi wmi-query get-wmiobject

我有脚本来获取基于PHP和WMI的IP地址,如下所示:

获取有源适配器网络

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;
    }
}

获取Active 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

但我想要的只是获得像 192.168.1.103

这样的IPv4

有人能帮助我吗?感谢

1 个答案:

答案 0 :(得分:0)

php代码中抽取IPAddress属性,任何使用过的语言中的数组非常简单。在MSDN文章Win32_NetworkAdapterConfiguration class中了解它:

  

<强>的IPAddress

     

数据类型:字符串数组
访问类型:只读
限定符:   MappingStrings   
(&#34; Win32Registry |系统\ CurrentControlSet \服务|参数\ TCPIP |的IPAddress&#34)

     

与当前网络关联的所有IP地址的数组   适配器。此属性可以包含IPv6地址或IPv4   地址。有关详细信息,请参阅IPv6 and IPv4 Support in WMI

但是(在您的问题主题上方),通过NameDescription属性识别网络适配器似乎不是一个好主意。请改用InterfaceIndex属性。阅读Win32_NetworkAdapterConfiguration class以及Win32_NetworkAdapter class MSDN文章:

  

<强> InterfaceIndex

     

数据类型: uint32
访问类型:只读

     

唯一标识本地网络接口的索引值。该   此属性中的值与中的值相同   Win32_IP4RouteTable实例中的InterfaceIndex属性   表示路由表中的网络接口。