【问题标题】:How to get meaningful network interface names instead of GUIDs with netifaces under Windows?如何在 Windows 下使用 netifaces 获取有意义的网络接口名称而不是 GUID?
【发布时间】:2015-04-28 07:53:08
【问题描述】:

我使用netifaces 模块。

import netifaces
print netifaces.interfaces()

但这显示了以下结果:

 ['{CDC97813-CC28-4260-BA1E-F0CE3081DEC7}',
 '{846EE342-7039-11DE-9D20-806E6F6E6963}',
 '{A51BA5F0-738B-4405-975F-44E67383513F}',
 '{A646FA85-2EC6-4E57-996E-96E1B1C5CD59}',
'{B5DC7787-26DC-4540-8424-A1D5598DC175}']

我想在 Windows 中获得一个“友好”的接口名称,例如“本地连接”。

我怎样才能得到它?

【问题讨论】:

标签: python python-2.7


【解决方案1】:

看起来netifaces 让我们将信息从 Windows 注册表中提取出来。以下函数适用于我在 Windows 8.1 上的 Python 3.4 下。

获取连接名称...

import netifaces as ni
import winreg as wr
from pprint import pprint

def get_connection_name_from_guid(iface_guids):
    iface_names = ['(unknown)' for i in range(len(iface_guids))]
    reg = wr.ConnectRegistry(None, wr.HKEY_LOCAL_MACHINE)
    reg_key = wr.OpenKey(reg, r'SYSTEM\CurrentControlSet\Control\Network\{4d36e972-e325-11ce-bfc1-08002be10318}')
    for i in range(len(iface_guids)):
        try:
            reg_subkey = wr.OpenKey(reg_key, iface_guids[i] + r'\Connection')
            iface_names[i] = wr.QueryValueEx(reg_subkey, 'Name')[0]
        except FileNotFoundError:
            pass
    return iface_names

x = ni.interfaces()
pprint(get_connection_name_from_guid(x))

.. 在我的机器上产生:

['Local Area Connection* 12',
 'Bluetooth Network Connection',
 'Wi-Fi',
 'Ethernet',
 'VirtualBox Host-Only Network',
 '(unknown)',
 'isatap.{4E4150B0-643B-42EA-AEEA-A14FBD6B1844}',
 'isatap.{BB05D283-4CBF-4514-B76C-7B7EBB2FC85B}']

获取驱动程序名称...

import netifaces as ni
import winreg as wr
from pprint import pprint

def get_driver_name_from_guid(iface_guids):
    iface_names = ['(unknown)' for i in range(len(iface_guids))]
    reg = wr.ConnectRegistry(None, wr.HKEY_LOCAL_MACHINE)
    reg_key = wr.OpenKey(reg, r'SYSTEM\CurrentControlSet\Control\Class\{4d36e972-e325-11ce-bfc1-08002be10318}')
    for i in range(wr.QueryInfoKey(reg_key)[0]):
        subkey_name = wr.EnumKey(reg_key, i)
        try:
            reg_subkey = wr.OpenKey(reg_key, subkey_name)
            guid = wr.QueryValueEx(reg_subkey, 'NetCfgInstanceId')[0]
            try:
                idx = iface_guids.index(guid)
                iface_names[idx] = wr.QueryValueEx(reg_subkey, 'DriverDesc')[0]
            except ValueError:
                pass
        except PermissionError:
            pass
    return iface_names

x = ni.interfaces()
pprint(get_driver_name_from_guid(x))

... 这给了我:

['Microsoft Wi-Fi Direct Virtual Adapter',
 'Bluetooth Device (Personal Area Network)',
 'Dell Wireless 1395 WLAN Mini-Card',
 'Broadcom 440x 10/100 Integrated Controller',
 'VirtualBox Host-Only Ethernet Adapter',
 '(unknown)',
 'Microsoft ISATAP Adapter',
 'Microsoft ISATAP Adapter']

【讨论】:

  • 适用于 Windows 10 和 Python 3.10,谢谢!
【解决方案2】:

Scapy 模块有一个内置的 get_windows_if_list() 运行良好。 (我稍微缩短了输出)

Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:59:51) [MSC v.1914 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from scapy.all import *
>>> get_windows_if_list()
[
    {'name': 'Realtek USB GbE Family Controller', 'win_index': '17', 'description': 'Ethernet', 'guid': '<guid>', 'mac': '<mac>', 'netid': 'Ethernet'},  
    {'name': 'Intel(R) Dual Band Wireless-AC 8260', 'win_index': '5', 'description': 'Wi-Fi', 'guid': '<guid>', 'mac': '<mac>', 'netid': 'Wi-Fi'}
]

【讨论】:

  • 这甚至适用于 Windows XP,这很不寻常
  • 这非常有用。
  • 注意,差不多 3 年后,这需要安装 npcap,如果您在不知情的情况下安装了它并且您在其他地方尝试过此代码,这可能会令人惊讶
  • 我不得不在 scapy 2.4.5 中使用 from scapy.arch.windows import * 代替 get_windows_if_list()
【解决方案3】:

我们也可以使用 Windows WMI:

import wmi

c = wmi.WMI()
qry = "select Name from Win32_NetworkAdapter where NetEnabled=True and NetConnectionStatus=2"

lst = [o.Name for o in c.query(qry)]
print(lst)

在我的机器上输出:

['Realtek PCIe GBE Family Controller', 'VMware Virtual Ethernet Adapter for VMnet1', 'VMware Virtual Ethernet Adapter for VMnet8', 'VirtualBox Host-Only Ethernet Adapter']

MSDN: Win32_NetworkAdapter class

【讨论】:

    【解决方案4】:

    MaxU 答案的扩展

    更准确/精致的方式

    Select Index from Win32_NetworkAdapterConfiguration WHERE IPEnabled = True or (ServiceName<>'' 
                                                        AND ServiceName<>'AsyncMac' 
                                                        AND ServiceName<>'VMnetx' AND ServiceName<>'VMnetadapter' AND ServiceName<>'Rasl2tp' AND ServiceName<>'msloop' AND ServiceName<>'PptpMiniport' 
                                                        AND ServiceName<>'Raspti' AND ServiceName<>'NDISWan' AND ServiceName<>'NdisWan4' AND ServiceName<>'RasPppoe' 
                                                        AND ServiceName<>'NdisIP' AND Description<>'PPP Adapter.') AND MACAddress is not NULL
    

    然后触发关于

    的查询
    SELECT * FROM Win32_NetworkAdapter where index= <Index>
    

    【讨论】:

      【解决方案5】:

      在 PowerShell 中要容易得多:

      Get-WmiObject -Class Win32_NetworkAdapterConfiguration | 
          Select-Object Description, SettingID, MACAddress | 
          Format-Table -AutoSize
      

      【讨论】:

        【解决方案6】:

        如果您知道接口使用的 IP 地址,您可以简单地执行以下操作:

        import netifaces as ni
        def get_interfaces():
            ifaces = ni.interfaces()
            for iface in ifaces:
                try:
                    ip = ni.ifaddresses(iface)[ni.AF_INET][0]["addr"]
                    print(f"IP: {ip} from Interface {iface}")
                except:
                    pass
        

        【讨论】:

          【解决方案7】:

          Here

          Scapy 的文档 (scapy.interfaces.NetworkInterface) NetworkInterface 类有多个数据变量

          class NetworkInterface(object):
          def __init__(self,
                       provider,  # type: InterfaceProvider
                       data=None,  # type: Optional[Dict[str, Any]]
                       ):
              # type: (...) -> None
              self.provider = provider
              self.name = ""
              self.description = ""
              self.network_name = ""
              self.index = -1
              self.ip = None  # type: Optional[str]
              self.ips = defaultdict(list)  # type: DefaultDict[int, List[str]]
              self.mac = None  # type: Optional[str]
              self.dummy = False
              if data is not None:
                  self.update(data)
          

          获取姓名的方法如下

          from scapy.all import *
          l=get_if_list()
          dict=IFACES.data
          for item in l:
              print(dic[item].name)
          

          以下是获取驱动程序名称的方法

          from scapy.all import *
          l=get_if_list()
          dict=IFACES.data
          for item in l:
              print(dic[item].description)
          

          【讨论】:

            猜你喜欢
            • 2015-08-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-06-15
            • 2011-04-19
            • 1970-01-01
            • 1970-01-01
            • 2018-03-11
            相关资源
            最近更新 更多