Vb.net:获取仅内部设备的MAC地址

时间:2015-03-25 06:23:29

标签: vb.net lan mac-address

我们使用以下方法获取MAC地址。

Imports System.Net.NetworkInformation
Dim nic As NetworkInterface = Nothing
Dim max() As String
Dim i As Integer
Dim nics() As NetworkInterface = NetworkInterface.GetAllNetworkInterfaces()
For Each nic In nics
    max(i) = nic.GetPhysicalAddress().ToString
    i = i + 1
Next

使用上面的代码,我们可以成功获得所有的MAC地址,包括加密狗的MAC地址[Plug&播放设备]。但我们想要的只是内部设备的MAC地址。

我们如何才能获得仅称为永久MAC地址的内部设备的MAC地址?

4 个答案:

答案 0 :(得分:0)

我认为局域网中的端点获取私有IP(作为DHCP响应),加密狗(外部USB GSM调制解调器)获取全局IP地址。

私有IP地址的标准范围:

  • A类网络 10.0.0.0 - 10.255.255.255
  • B类网络 172.16.0.0 - 172.31.255.255
  • C类网络 192.168.0.0 - 192.168.255.255

您可以使用正则表达式来确定每个界面的当前IP地址是否为私有。

你可以帮助这个正则表达式(source):

(^10\.)|
(^172\.1[6-9]\.)|(^172\.2[0-9]\.)|(^172\.3[0-1]\.)|
(^192\.168\.)

例如,这是VB.net中上述的基本正则表达式匹配:

Imports System.Net.NetworkInformation
Imports System.Text.RegularExpressions

Module VBModule

    Sub Main()
        Dim nic As NetworkInterface = Nothing
        Dim max() As String
        Dim nics() As NetworkInterface = NetworkInterface.GetAllNetworkInterfaces()
        For Each nic In nics

            Dim ip = nic.GetIPProperties().UnicastAddresses(0).Address.ToString

            Dim regex As Regex = New Regex("(^10\.)|(^172\.1[6-9]\.)|(^172\.2[0-9]\.)|(^172\.3[0-1]\.)|(^192\.168\.)")
            Dim match As Match = regex.Match(ip)

            If match.Success Then
                Console.WriteLine(ip)
                Console.WriteLine(nic.GetPhysicalAddress().ToString)     
            End If

        Next

    End Sub

End Module

在行动http://goo.gl/i9N6T9中查看:

答案 1 :(得分:0)

以下代码返回最常见的持久接口(LAN或WL​​AN)的MAC地址。这通常可以完成工作。您可以向比较数组添加不同的接口类型。

Public Function GetDurableMACAddresses() As IEnumerable(Of String)
    Return From nic In NetworkInterface.GetAllNetworkInterfaces()
           Where ({NetworkInterfaceType.Ethernet, NetworkInterfaceType.Wireless80211}).Contains(nic.NetworkInterfaceType)
           Select macaddress = nic.GetPhysicalAddress().ToString()
End Function

答案 2 :(得分:-1)

以下功能可用于获取内部MAC地址:

Private Function getMacAddress() As String
    Try
        Dim adapters As NetworkInterface() = NetworkInterface.GetAllNetworkInterfaces()
        Dim adapter As NetworkInterface
        Dim myMac As String = String.Empty

        For Each adapter In adapters
            Select Case adapter.NetworkInterfaceType
                'Exclude Tunnels, Loopbacks and PPP
                Case NetworkInterfaceType.Tunnel, NetworkInterfaceType.Loopback, NetworkInterfaceType.Ppp
                Case Else
                    If Not adapter.GetPhysicalAddress.ToString = String.Empty And Not adapter.GetPhysicalAddress.ToString = "00000000000000E0" Then
                        myMac = adapter.GetPhysicalAddress.ToString
                        Exit For
                    End If

            End Select
        Next adapter

        Return myMac
    Catch ex As Exception
        Return String.Empty
    End Try
End Function

它使用网络信息库,可以使用Imports System.Net.NetworkInformation导入。上述代码也不包括VPN,隧道,网桥等。

为了测试这个,我制作了一个can be downloaded here的示例项目,并将正确的MAC地址输出为:

  

系统的媒体访问控制(MAC)地址是142D27B97FD6

这是通过查看我的无线适配器的属性进行测试的正确MAC地址:

enter image description here

答案 3 :(得分:-2)

如果没有关于NIC本身的其他信息,则无法识别"内部"那些 - :如果你构建了一个CLR(C ++) - 库,它调用本机函数来检索必要的信息,例如"哪个总线是NIC所在的"您可以组装有关NIC的分组信息。

提示:很容易在VB.NET中使用CLR库 - 应用程序......只需添加项目,导入其namespace,您就可以了:{{3} }

首先,您需要使用参数GUID_DEVCLASS_NET通过https://msdn.microsoft.com/en-us/library/ms235638%28v=vs.90%29.aspx查询所有网卡,然后使用SetupDiGetClassDevs枚举该列表,属性SetupDiEnumDeviceInfo就是您所需要的&# 39;对此感兴趣,您可以通过DEVPKEY_Device_BusTypeGuid检索它 - 在枚举完所有设备之后,您现在可以将它们分组为总线类型,其中至少有一种是USB型号。

可以通过列出SetupDiGetDevicePropertyherehere列出的所有其他属性进行其他过滤。

嗯,这是非常昂贵的解决方案,但 实际上可以让你过滤掉内部"网卡,祝你好运 - 随时提出任何问题。

编辑:显然还有一个针对USB设备的GUID,因此如果您只是检索属性here并将其与DEVPKEY_DeviceInterface_ClassGuid进行比较,则可能会过滤掉即时USB-NIC,无需额外分组......这看起来很有希望