python3获取windows10电脑的所有网卡信息(网卡名字、IP、子网掩码、网关信息)

在网上找了些,但是都不符合自己的需要,自己动手获取,方法是解析cmd 的ipconfig命令内容

代码:

import subprocess
import re


# 执行windows命令
def exec_command(commands) -> list:
    """执行windows命令"""
    if not commands:
        return list()
    # 子进程的标准输出设置为管道对象
    if isinstance(commands, str):
        commands = [commands]
    return_list = []
    for i in commands:
        p = subprocess.Popen(i, shell=True, stdout=subprocess.PIPE, universal_newlines=True)
        p.wait()
        res = "".join(p.stdout.readlines())
        return_list.append(res)
    return return_list


def get_net_card():
    """
    功能:通过ipconfig返回的文本解析网卡名字、ip、掩码、网关等信息
    注释:简单做了注释
    测试:在window10 专业版测试通过(可以检测到以太网两个(包含手机、网线)、wifi一个)
    测试反馈:如果使用发现其余问题可以反馈到 sunnylishaoxu@163.com,非常感谢
    说明一:
       默认网关. . . . . . . . . . . . . : fe80::10b1:1865:86e8:ad10%41
                                           172.20.10.1
    """
    net_card_data = list()
    res = exec_command("ipconfig")
    temp_dict = dict(flag=True)
    gateway_error = False
    for x in res[0].splitlines():
        # 匹配IP正则
        pattern = re.compile(r'((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})(\.((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})){3}')
        # 测试发现有的网关会默认在下一行,情况见说明一,所以这边检查到默认网关,发现没有匹配到,则从下一行找
        if gateway_error:
            temp_dict['gateway1'] = pattern.search(x).group()
            gateway_error = False
            print("当前网卡 %s 获取第二行网关信息 %s" % (temp_dict['card_name'], temp_dict['gateway1']))
            continue
        # 如果发现新的适配器,则重置上一个网卡是否可用的状态
        if "适配器" in x:
            temp_dict = dict(flag=True)
            temp_dict['card_name'] = x.split(" ",  1)[1][:-1]
            print("当前网卡 %s" % (temp_dict['card_name']))
            continue
        if "IPv4 地址" in x:
            temp_dict['ip'] = pattern.search(x).group()
            print("当前网卡 %s 获取IP信息 %s" % (temp_dict['card_name'], temp_dict['ip']))
            continue
        elif "子网掩码" in x:
            temp_dict['mask'] = pattern.search(x).group()
            print("当前网卡 %s 获取子网掩码信息 %s" % (temp_dict['card_name'], temp_dict['mask']))
            continue
        # 测试发现有的网关会默认在下一行,情况见说明一,所以这边做了异常处理
        elif "默认网关" in x:
            try:
                temp_dict['gateway1'] = pattern.search(x).group()
                print("当前网卡 %s 获取默认网关信息 %s" % (temp_dict['card_name'], temp_dict['gateway1']))
            except:
                gateway_error = True
                print("当前网卡 %s 解析当前行默认网关信息错误" % (temp_dict['card_name']))

            # 如果检查到网关,代表当前适配器信息已经获取完毕 重置网关状态与适配器信息字典
            if temp_dict.get("gateway1"):
                net_card_data.append(temp_dict)
                print("当前网卡 %s 当前适配器信息获取完毕 %s \n\n" % (temp_dict['card_name'], temp_dict))

                temp_dict = dict(flag=True)
                continue
        # 发现媒体已断开则更改当前适配器状态
        elif "媒体已断开" in x:
            print("当前网卡 %s 已断开 跳过\n\n" % (temp_dict['card_name']))
            temp_dict['flag'] = False
            continue
        # 判断媒体状态正常,IP、子网掩码、网关都正常后,保持起来
        if temp_dict.get("flag") and temp_dict.get("ip") and temp_dict.get("mask") and temp_dict.get("gateway1"):
            print("当前网卡 %s 当前适配器信息获取完毕 %s \n\n" % (temp_dict['card_name'], temp_dict))
            net_card_data.append(temp_dict)
            # 重置网关状态与适配器信息字典
            temp_dict = dict(flag=True)
            continue
    for i in net_card_data:
        print("%s:%s" % (i.get("card_name"), i))
    return net_card_data


get_net_card()

运行结果:

当前网卡 以太网
当前网卡 以太网 获取IP信息 192.168.1.146
当前网卡 以太网 获取子网掩码信息 255.255.255.0
当前网卡 以太网 获取默认网关信息 192.168.1.1
当前网卡 以太网 当前适配器信息获取完毕 {'flag': True, 'card_name': '以太网', 'ip': '192.168.1.146', 'mask': '255.255.255.0', 'gateway1': '192.168.1.1'} 
当前网卡 本地连接* 9
当前网卡 本地连接* 9 已断开 跳过
当前网卡 本地连接* 10
当前网卡 本地连接* 10 已断开 跳过
当前网卡 以太网 3
当前网卡 以太网 3 获取IP信息 172.20.10.3
当前网卡 以太网 3 获取子网掩码信息 255.255.255.240
当前网卡 以太网 3 解析当前行默认网关信息错误
当前网卡 以太网 3 获取第二行网关信息 172.20.10.1
当前网卡 以太网 3 当前适配器信息获取完毕 {'flag': True, 'card_name': '以太网 3', 'ip': '172.20.10.3', 'mask': '255.255.255.240', 'gateway1': '172.20.10.1'} 
当前网卡 WLAN
当前网卡 WLAN 获取IP信息 192.168.1.114
当前网卡 WLAN 获取子网掩码信息 255.255.255.0
当前网卡 WLAN 获取默认网关信息 192.168.1.1
当前网卡 WLAN 当前适配器信息获取完毕 {'flag': True, 'card_name': 'WLAN', 'ip': '192.168.1.114', 'mask': '255.255.255.0', 'gateway1': '192.168.1.1'} 
当前网卡 蓝牙网络连接
当前网卡 蓝牙网络连接 已断开 跳过
以太网:{'flag': True, 'card_name': '以太网', 'ip': '192.168.1.146', 'mask': '255.255.255.0', 'gateway1': '192.168.1.1'}
以太网 3:{'flag': True, 'card_name': '以太网 3', 'ip': '172.20.10.3', 'mask': '255.255.255.240', 'gateway1': '172.20.10.1'}
WLAN:{'flag': True, 'card_name': 'WLAN', 'ip': '192.168.1.114', 'mask': '255.255.255.0', 'gateway1': '192.168.1.1'}

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要在Windows编程中获取本地所有网卡信息,包括网卡描述、IP地址、子网掩码和MAC地址,可以使用Windows提供的API函数来实现。以下是实现的方法。 首先,使用GetAdaptersInfo函数来获取本地所有网卡信息。这个函数需要传入一个缓冲区,用于存储网卡信息。可以调用GetAdaptersInfo两次,第一次用于检查缓冲区的大小,第二次用于获取实际的网卡信息。 接下来,遍历网卡信息获取每个网卡的描述、IP地址、子网掩码和MAC地址。可以使用ipconfig命令行工具的输出来比对获取到的信息,确保正确性。 下面是一个示例代码,用于获取本地所有网卡信息: ```cpp #include <iostream> #include <windows.h> #include <iphlpapi.h> #include <cstring> #pragma comment(lib, "iphlpapi.lib") int main() { PIP_ADAPTER_INFO pAdapterInfo; ULONG ulOutBufLen = sizeof(IP_ADAPTER_INFO); DWORD dwRetVal; pAdapterInfo = (IP_ADAPTER_INFO *)malloc(sizeof(IP_ADAPTER_INFO)); if (GetAdaptersInfo(pAdapterInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW) { free(pAdapterInfo); pAdapterInfo = (IP_ADAPTER_INFO *)malloc(ulOutBufLen); } if ((dwRetVal = GetAdaptersInfo(pAdapterInfo, &ulOutBufLen)) == NO_ERROR) { PIP_ADAPTER_INFO pAdapter = pAdapterInfo; while (pAdapter) { std::cout << "网卡描述: " << pAdapter->Description << std::endl; std::cout << "IP地址: "; IP_ADDR_STRING *pIpAddress = &(pAdapter->IpAddressList); while (pIpAddress) { std::cout << pIpAddress->IpAddress.String << " "; pIpAddress = pIpAddress->Next; } std::cout << std::endl; std::cout << "子网掩码: "; IP_ADDR_STRING *pSubnetMask = &(pAdapter->IpAddressList); while (pSubnetMask) { std::cout << pSubnetMask->IpMask.String << " "; pSubnetMask = pSubnetMask->Next; } std::cout << std::endl; std::cout << "MAC地址: "; for (int i = 0; i < pAdapter->AddressLength; i++) { if (i == (pAdapter->AddressLength - 1)) printf("%.2X\n", (int)pAdapter->Address[i]); else printf("%.2X-", (int)pAdapter->Address[i]); } std::cout << std::endl; pAdapter = pAdapter->Next; } } else { std::cout << "获取网卡信息失败" << std::endl; } if (pAdapterInfo) free(pAdapterInfo); return 0; } ``` 以上代码使用了IPHlpApi.h头文件中提供的函数和结构体,通过两次调用GetAdaptersInfo函数来获取本地所有网卡信息,然后遍历得到每个网卡的描述、IP地址、子网掩码和MAC地址。在编译时需要链接IPHlpApi.lib库文件,否则会出现链接错误。 响应完成后,我们就可以在控制台或其他输出方式中看到本地所有网卡的相关信息了。 ### 回答2: 可以通过使用Windows提供的API函数来获取本地所有网卡信息,代码示例如下: ```cpp #include <iostream> #include <windows.h> #include <iphlpapi.h> // 链接IPHlpApi.lib库 #pragma comment(lib, "IPHlpApi.lib") int main() { IP_ADAPTER_INFO* adapterInfo; ULONG bufferSize = 0; // 缓冲区大小 DWORD result = GetAdaptersInfo(NULL, &bufferSize); // 获取网卡信息的缓冲区大小 if (result == ERROR_BUFFER_OVERFLOW) { adapterInfo = (IP_ADAPTER_INFO*)malloc(bufferSize); // 分配缓冲区 result = GetAdaptersInfo(adapterInfo, &bufferSize); // 重新获取网卡信息 if (result != ERROR_SUCCESS) { std::cout << "获取网卡信息失败" << std::endl; return -1; } IP_ADAPTER_INFO* pAdapterInfo = adapterInfo; while (pAdapterInfo) { std::cout << "网卡描述:" << pAdapterInfo->Description << std::endl; std::cout << "IP 地址:" << pAdapterInfo->IpAddressList.IpAddress.String << std::endl; std::cout << "子网掩码:" << pAdapterInfo->IpAddressList.IpMask.String << std::endl; std::cout << "MAC 地址:" << pAdapterInfo->Address << std::endl; pAdapterInfo = pAdapterInfo->Next; // 移动到下一个网卡 } } free(adapterInfo); // 释放缓冲区 return 0; } ``` 上述代码中使用了`GetAdaptersInfo`函数来获取网卡信息,首先调用一次获取缓冲区大小,然后根据返回的大小分配内存,再次调用函数获取网卡信息。之后通过遍历获取网卡信息,输出各个字段的值,包括网卡描述、IP 地址、子网掩码和 MAC 地址。 需要注意的是,上述代码中链接了`IPHlpApi.lib`库,并且使用了相关的头文件。此外,编译时需要选择合适的编译器和配置,以保证代码的正确性。 ### 回答3: 要获取本地所有网卡信息,包括网卡描述、IP地址、子网掩码和MAC地址,可以使用Windows编程语言进行实现。以下是一个可能的代码示例: ```csharp using System; using System.Net.NetworkInformation; class Program { static void Main() { NetworkInterface[] interfaces = NetworkInterface.GetAllNetworkInterfaces(); foreach (NetworkInterface networkInterface in interfaces) { Console.WriteLine("网卡描述: " + networkInterface.Description); foreach (UnicastIPAddressInformation ip in networkInterface.GetIPProperties().UnicastAddresses) { if (ip.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) { Console.WriteLine("IP地址: " + ip.Address.ToString()); Console.WriteLine("子网掩码: " + ip.IPv4Mask.ToString()); } } Console.WriteLine("MAC地址: " + networkInterface.GetPhysicalAddress().ToString()); Console.WriteLine(); } Console.ReadLine(); } } ``` 这段代码使用了`System.Net.NetworkInformation`命名空间中的`NetworkInterface`类来获取本地所有网卡信息。通过`GetAllNetworkInterfaces`方法可以获取到一个`NetworkInterface`对象数组,每个对象代表一个网卡。 然后,通过遍历每个网卡对象,可以获取网卡描述信息 `Description`。接着,遍历网卡对象的`UnicastAddresses`属性,获取IP地址和子网掩码。这里只获取IPv4地址,通过判断`ip.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork`过滤掉IPv6地址。 最后,通过`GetPhysicalAddress`方法获取到MAC地址。 以上是一个简单的实现,可以根据需要进一步优化和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值