徐冬丽 发表于 2017-7-6 14:43:05

MAC地址获取,有线网卡与无线网卡、物理网卡与虚拟网卡的区分

获取当前活跃状态的网卡MAC地址、物理地址
  Wmic命令:Win32_NetworkAdapter和Win32_NetworkAdapterConfiguration。
  其中cmd命令行执行:
  1. Wmic Path Win32_NetworkAdapterget GUID,MACAddress,NetEnabled,PhysicalAdapter,Index
  备注:
  GUID:连接唯一标识;
  MACAddress:网卡地址;
  NetEnabled: 是否启用了适配器,True为启用,False为禁用;
  PhysicalAdapter: 适配器是否物理或逻辑适配器,True为物理,False为逻辑;
  Index: 网络适配器的索引号,存储在系统注册表中。注册表路径Win32Registry|System\\CurrentControlSet\\Control\\Class\\{4D36E972-E325-11CE-BFC1-08002BE10318}.
  Msdn地址:
  https://msdn.microsoft.com/en-us/library/aa394216(v=vs.85).aspx
  要求:
  Minimum supported client
  Windows Vista
  Minimum supported server
  Windows Server 2008
  Namespace
  Root\CIMV2
  MOF
  CIMWin32.mof
  DLL
  CIMWin32.dll
  2. Wmic Path Win32_NetworkAdapterConfiguration get IPEnabled,MACAddress,SettingID, IPAddress, IPSubnet,Index
  备注:
  IPEnabled: 是否启用了适配器,True为启用,False为禁用;
  MACAddress:网卡地址;
  SettingID: 连接唯一标识;
  IPAddress:IP地址;
  IPSubnet:子网掩码;
  Index: Windows网络适配器配置的索引号,在有多个配置时使用。注册表路径Win32Registry|System\\CurrentControlSet\\Control\\Class\\{4D36E972-E325-11CE-BFC1-08002BE10318};
  Msdn地址:
  https://msdn.microsoft.com/en-us/library/aa394217(v=vs.85).aspx#
  要求:
  Minimum supported client
  Windows Vista
  Minimum supported server
  Windows Server 2008
  Namespace
  Root\CIMV2
  MOF
  CIMWin32.mof
  DLL
  CIMWin32.dll
  参数匹配关系:
  Win32_NetworkAdapter
  Win32_NetworkAdapterConfiguration
  GUID
  SettingID
  NetEnabled
  IPEnabled
  MACAddress
  MACAddress
  Index
  Index
区分物理网卡和虚拟网卡
  通过“Characteristics”这个值来确定网卡的类型是虚拟网卡还是物理网卡。
  Characteristics值在注册表在HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Class\{4d36e972-e325-11ce-bfc1-08002be10318}\【连接索引号】\下,在windows中,Characteristics 的取值如下,Characteristics项可以有1个或多个如下的值(多值应计算总和):【备注:在Windows7和Windows10下确认,Characteristics为dword,不可能多个值,这里的多个值,计算总和暂时未知。】
  0x1
  NCF_VIRTUAL
  说明组件是个虚拟适配器
  0x2
  NCF_SOFTWARE_ENUMERATED
  说明组件是一个软件模拟的适配器
  0x4
  NCF_PHYSICAL
  说明组件是一个物理适配器
  0x8
  NCF_HIDDEN
  说明组件不显示用户接口
  0x10
  NCF_NO_SERVICE
  说明组件没有相关的服务(设备驱动程序)
  0x20
  NCF_NOT_USER_REMOVABLE
  说明不能被用户删除(例如,通过控制面板或设备管理器)
  0x40
  NCF_MULTIPORT_INSTANCED_ADAPTER
  说明组件有多个端口,每个端口作为单独的设备安装。每个端口有自己的hw_id(组件ID) 并可被单独安装,这只适合于EISA适配器
  0x80
  NCF_HAS_UI
  说明组件支持用户接口(例如,Advanced Page或Customer Properties Sheet)
  0x400
  NCF_FILTER
  说明组件是一个过滤器
  如果是虚拟网卡:Characteristics & NCF_VIRTUAL ==NCF_VIRTUAL
  如果是物理网卡:Characteristics & NCF_PHYSICAL ==NCF_PHYSICAL
  Example:
  Characteristics的值为0x84,则0x84&0x4=0x4,则表示该网卡为物理网卡。
  备注:
  该方法在实体机上测试,可以区分开物理网卡和虚拟网卡;但是,在虚拟机系统中,也可以找到物理网卡。
  参考地址:
  http://blog.csdn.net/jianghui3132749/article/details/4868350
  总结:
  获取当前活跃的物理网卡地址,可以直接使用Win32_NetworkAdapter,Win32_NetworkAdapterConfiguration主要作为一个参考比较。另外,命令支持系统最低版本有所限制,Windows Vista及以上,服务器版本Windows Server 2008及以上。
判断无线网卡和有线网卡
  1. 注册表路径:HKLM\SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}\【连接唯一标识】\Connection
  路径下的键值:MediaSubType,如果Value=2,表示无线网卡。
  2. 注册表路径:HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Class\{4d36e972-e325-11ce-bfc1-08002be10318}\【连接索引号】\Ndi\Interfaces
  路径下的键值:LowerRange,如果Value包含wifi或者wlan,(验证的两台设备Value=“wlan,ethernet,vwifi”),表示无线网卡。
  总结:如上两种方法判断是否无线网卡的判断标准, 对于标准的适用性,特殊情况,如VPN、虚拟网卡等情况是否有能很好的支持,仍然需要验证。另外,3G网卡等尚未在判断标准中,暂不支持。
  备注:通过“netsh wlan set hostednetwork mode=allow ssid=Simnovo key=SimnovoWifi”命令创建的无线虚拟网卡,在判断条件1,2下,均验证为无线网卡,但是结合Characteristics的值判断物理网卡,可以区分出来该网卡是无线虚拟网卡。
  通过物理网卡条件以及无线网卡条件结合判断,采用wmic和注册表方式相对比较稳定。
判断流程
  1. Win7以上设备:执行Wmic Path Win32_NetworkAdapter get GUID,MACAddress,NetEnabled,PhysicalAdapter,Index,获取NetEnabled和PhysicalAdapter均为True的项。其中NetEnabled获取的True是为了获取当前使用中的网卡。GUID为连接唯一标识,Index为连接索引号。
  XP设备:由于XP对Win32_NetworkAdapter部分字段不支持,采用Wmic Path Win32_NetworkAdapterConfiguration get IPEnabled,MACAddress,SettingID, IPAddress, IPSubnet,Index,获取IPEnabled为True的想,其中,IPEnabled获取的True是为了获取当前使用中的网卡。SettingID为连接唯一标识,Index为连接索引号。
  2. 根据1中获取到的连接索引号,注册表路径“HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Class\{4d36e972-e325-11ce-bfc1-08002be10318}\【连接索引号】\”下,判断Characteristics,筛选出物理网卡
  3. 根据2中获取的物理网卡,采用判断有线网卡和无线网卡两中方案进行筛选,获取最终的当前使用中的网卡为有线物理网卡还是无线物理网卡。
验证结果【图片有些小,点击链接查看】
  联想win8.1 WIFI 【正确】

  联想win8 WIFI 【正确】

  三星win8 WIFI 【正确】

  XPE有线 【正确】

  联想win7有线 【正确】

  Win10 有线 【正确】

  HP 有线 【正确】

  HP wifi 【正确】

  HP 3G: 【错误】

  推荐一下自己的网站:www.mylofter.com:81,平行世界
页: [1]
查看完整版本: MAC地址获取,有线网卡与无线网卡、物理网卡与虚拟网卡的区分