我们使用以下方法获取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地址?
答案 0 :(得分:0)
我认为局域网中的端点获取私有IP(作为DHCP响应),加密狗(外部USB GSM调制解调器)获取全局IP地址。
私有IP地址的标准范围:
您可以使用正则表达式来确定每个界面的当前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
答案 1 :(得分:0)
以下代码返回最常见的持久接口(LAN或WLAN)的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地址:
答案 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型号。
可以通过列出SetupDiGetDeviceProperty,here和here列出的所有其他属性进行其他过滤。
嗯,这是非常昂贵的解决方案,但 实际上可以让你过滤掉内部"网卡,祝你好运 - 随时提出任何问题。
编辑:显然还有一个针对USB设备的GUID,因此如果您只是检索属性here并将其与DEVPKEY_DeviceInterface_ClassGuid进行比较,则可能会过滤掉即时USB-NIC,无需额外分组......这看起来很有希望