在有多个网卡,配置了多个IP的情况下,python 获取本地网卡的主IP

如图所示有多个网卡

 

本地网卡配置了多个IP

class Public_IPOp:
    @staticmethod
    def GetLocalIP():
        rt = [False]
        # 根节点
        reg_root = win32con.HKEY_LOCAL_MACHINE
        # 网卡设备键的路径
        reg_path = r"SYSTEM\CurrentControlSet\Control\Class\{4d36e972-e325-11ce-bfc1-08002be10318}"
        # 权限和参数设置
        reg_flags = win32con.WRITE_OWNER | win32con.KEY_WOW64_64KEY | win32con.KEY_ALL_ACCESS
        # 网卡IP信息地址
        IP_Path = r"SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces"
        try:
            key = win32api.RegOpenKeyEx(reg_root, reg_path, 0, reg_flags)
            for item in win32api.RegEnumKeyEx(key):
                # 先判断是否是PCI设备
                try:
                    subPath = reg_path + '\\' + item[0]
                    subkey = win32api.RegOpenKey(reg_root, subPath, 0, reg_flags)
                except:
                    pass
                    # rt.clear()
                    # rt.append(False)
                    # rt.append(subPath+'拒绝访问')
                try:
                    if 0 == win32api.RegQueryValueEx(subkey, 'DeviceInstanceID')[0].find('PCI'):
                        # 判断是否是ethernet
                        LowerRangePath = reg_path + '\\' + item[0] + '\\Ndi\\Interfaces'
                        LowerRangekey = win32api.RegOpenKey(reg_root, LowerRangePath, 0, reg_flags)
                        if 'ethernet' == win32api.RegQueryValueEx(LowerRangekey, 'LowerRange')[0]:
                            ip_path = IP_Path + '\\' + win32api.RegQueryValueEx(subkey, 'NetCfgInstanceId')[0]
                            # print(ip_path)
                            IpKey = win32api.RegOpenKey(reg_root, ip_path, 0, reg_flags)
                            if len(win32api.RegQueryValueEx(IpKey, 'IPAddress')) > 0:
                                if len(win32api.RegQueryValueEx(IpKey, 'IPAddress')[0]) > 0:
                                    # print(win32api.RegQueryValueEx(IpKey, 'IPAddress')[0][0])
                                    rt.clear()
                                    rt.append(True)
                                    rt.append(win32api.RegQueryValueEx(IpKey, 'IPAddress')[0][0])

                except:
                    pass
                    # rt.clear()
                    # rt.append(False)
                    # rt.append(item[0]+'系统找不到DeviceInstanceID')
                # 关闭键
                win32api.RegCloseKey(key)
        except Exception as e:
            rt.clear()
            rt.append(False)
            rt.append("注册表拒绝访问,请检查路径%s是否存在或以管理员身份运行" % (reg_path))

        return rt

 

posted @ 2019-10-24 18:32  夏日已末  阅读(1011)  评论(0编辑  收藏  举报