我正在尝试从计算机检索板载以太网适配器的 MAC 地址,以便为设备生成唯一标识符。 下面是我正在使用的方法。

NetworkInterface[] ifConfig = NetworkInterface.GetAllNetworkInterfaces();
int maxHash = int.MinValue;
Guid D = Guid.Empty;

foreach (NetworkInterface net in ifConfig)
{
    if (net.NetworkInterfaceType == NetworkInterfaceType.Ethernet)
    {
                if (maxHash < net.GetPhysicalAddress().ToString().GetHashCode())
                {
                    maxHash = net.GetPhysicalAddress().ToString().GetHashCode();

                    ID = new Guid(String.Concat("00000000-0000-0000-0000-", net.GetPhysicalAddress().ToString()));

                }
    }
}

但是,蓝牙适配器、VM 适配器和其他几个网络适配器也属于NetworkInterfaceType.Ethernet类型。 如何具体获取板载以太网连接的 MAC 地址?

做一个包含来省略那些是不可能的。 任何帮助将不胜感激。

#1楼 票数:1

我最近编写了一个 Powershell 脚本来为 Windows PC 生成一个永久的系统格式不可变的唯一 ID,用于库存目的(QR 编码 ID,将其打印在贴纸上......)。

它将 PC 制造商 UUID 字段与每个连接 PCI 的网络适配器的永久 MAC 地址连接起来(按 MAC 字母顺序排序)。 PCI 要求会自动取消可移动或虚拟 NIC。 真正的脚本 MD5 对结果字符串进行哈希处理以获得更同质的标识符(恒定长度和 0-9A-F 符号集),但为了简单起见,我将在此处省略这一点

我本可以选择 PC 制造商 UUID 并收工,但我对依赖于以下内容的 ID 感到不舒服:

  • 世界上每个PC制造商都在努力填补UUID BIOS领域。
  • 每个 PC 制造商都在努力跟踪已使用的 UUID

基本上,我试图坚持将尽可能多的具有永久和“唯一”(梦想)标识符的不可拆卸组件放入混音器的直观想法。

这种 ID 生成技术不是防故障的:如果将新的 PCI 网络适配器添加到系统中,ID 将更改。 但是随着集成 NIC 的普及,我相信这不再需要担心,如果曾经是的话。

这个解决方案并不直接适用于 C#,但我相信它可以很容易地适应,因为 Powershell 共享几乎相同的 .net 对象类生态系统。

#Variable names in spanish, but if I try to translate them in a hurry
#I will most certainly end up with a non-working script

$elpc=(Get-WmiObject -Class Win32_ComputerSystemProduct)
$id=$elpc.UUID #This is the UUID the manufacturer wrote somewhere in the BIOS

#Get network devices
#"Net" for network devices, "PCI*" because PCI connected devices begin that way
$dispositivosdered=@(Get-PnpDevice | Where-Object {($_.Class -eq "Net") -and ($_.InstanceId -like "PCI*")})

#Get network adapters
#Use "PermanentAddress" property. "MacAddress" property can be spoofed easily
$tarjetasdered=@(Get-Netadapter | Sort-Object PermanentAddress)

#Double loop to rule out any network adapters which are not PCI
#Comparison is made using long name, ie "Realtek PCIe GBE Family Controller #2"
#Is the only valid field I found to (inner) join the device and adapter worlds
for($j=0; $j -lt $tarjetasdered.length; $j++) {
    for ($i=0; $i -lt $dispositivosdered.length; $i++) {
        if($dispositivosdered[$i].FriendlyName -eq $tarjetasdered[$j].InterfaceDescription) {
            if(-not [string]::IsNullOrEmpty($tarjetasdered[$j].PermanentAddress)) {
                $id= $id + $tarjetasdered[$j].PermanentAddress.Replace("-", "");
            }
        }
    }
}

#2楼 票数:0

作为一种选择(不是最好的,但仍然是 =))-您可以尝试使用公制。 在大多数情况下,网络的度量以物理网卡的优先级

            using System;
            using System.Collections.Generic;
            using System.ComponentModel;
            using System.Data;
            using System.Drawing;
            using System.Linq;
            using System.Management;
            using System.Net.NetworkInformation;
            using System.Text;
            using System.Threading.Tasks;
            using System.Windows.Forms;

private void button1_Click(object sender, EventArgs e)
        {
            listBox1.Items.Clear();
                ManagementObjectSearcher query = new
                 ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = 'TRUE'");
                ManagementObjectCollection queryCollection = query.Get();
                foreach (ManagementObject mo in queryCollection)
                {
                    if (!(mo["Description"].ToString().Contains("VM")))
                    {
                        if (!(mo["Description"].ToString().Contains("Virtual")))
                        {
                            if (!(mo["Description"].ToString().Contains("Hyper")))
                            {
                                string[] addresses = (string[])mo["IPAddress"];

                                string IPConnectionMetric = Convert.ToString(mo["IPConnectionMetric"]).Trim();

                                foreach (string ipaddress in addresses)
                                {

                                    listBox1.Items.Add(ipaddress + ";" + IPConnectionMetric);
                                }

                            }

private void button2_Click(object sender, EventArgs e)

{

    if (listBox1.Items.Count > 1)
                {     
                    int maximum = int.MinValue;
                    int minimum = int.MaxValue;
                    for (int i = 0; i < listBox1.Items.Count; i++)

                  {
                        int output = Convert.ToInt32(listBox1.Items[i].ToString().Split(';')[1]);
                        if ((int)output > maximum)
                            maximum = (int)output;

                    }

                    for (int i = 0; i < listBox1.Items.Count; i++)
                    {
                        int output = Convert.ToInt32(listBox1.Items[i].ToString().Split(';')[1]);
                        if ((int)output < maximum)
                            minimum = (int)output;

                        if (listBox1.Items[i].ToString().Contains(minimum.ToString()))
                        {       
                            var minmetric = listBox1.Items[i].ToString();

                            NetworkInterface[] ifConfig = NetworkInterface.GetAllNetworkInterfaces();
                            int maxHash = int.MinValue;
                            Guid D = Guid.Empty;
                            foreach (NetworkInterface net in ifConfig)
                            {
                                if (net.NetworkInterfaceType == NetworkInterfaceType.Ethernet)
                                {
                                    if (maxHash < net.GetPhysicalAddress().ToString().GetHashCode())
                                    {
                                        maxHash = net.GetPhysicalAddress().ToString().GetHashCode();

                                        foreach (UnicastIPAddressInformation ip in net.GetIPProperties().UnicastAddresses)
                                        {

                                            if (ip.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
                                            {

                                                if (ip.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
                                                {
                                                    if (ip.Address.ToString().Contains(minmetric.ToString().Split(';')[0]))
                                                    {
                                                        var ID = new Guid(String.Concat("00000000-0000-0000-0000-", net.GetPhysicalAddress().ToString()));
                                                    }
                                                }
            else
                {

                    NetworkInterface[] ifConfig = NetworkInterface.GetAllNetworkInterfaces();
                    int maxHash = int.MinValue;
                    Guid D = Guid.Empty;

                    foreach (NetworkInterface net in ifConfig)
                    {
                        if (net.NetworkInterfaceType == NetworkInterfaceType.Ethernet)
                        {
                            if (maxHash < net.GetPhysicalAddress().ToString().GetHashCode())
                            {
                                maxHash = net.GetPhysicalAddress().ToString().GetHashCode();

                                var ID = new Guid(String.Concat("00000000-0000-0000-0000-", net.GetPhysicalAddress().ToString()));

                            }
                        }
                    }

#3楼 票数:0

using system.Management;
private string GetMACAddress()
    {
        ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
        ManagementObjectCollection moc = mc.GetInstances();
        string MACAddress = String.Empty;
        foreach (ManagementObject mo in moc)
        {
            if (MACAddress == String.Empty)  // only return MAC Address from first card  
            {
                if ((bool)mo["IPEnabled"] == true) MACAddress = mo["MacAddress"].ToString();
            }
            mo.Dispose();
        }
        MACAddress = MACAddress.Replace(":", "");
        return MACAddress;
    }

  ask by AnOldSoul translate from so

未解决问题?本站智能推荐:

7回复

如何从Windows程序访问类似netstat的以太网统计信息

如何从netstat -e等C / C ++代码访问以太网统计信息?
3回复

以太网端口的节流带宽

我正在编写一个应用程序在服务器上运行,我需要能够为每个以太网端口设置最大带宽(最多可以有6个端口)。 显然我可以限制我的应用程序使用的带宽,但我还没有找到任何关于限制计算机上实际以太网端口带宽的信息。 这是否需要通过创建一个驱动程序来监控所有端口来完成? 有人能指出我正确的方向吗?
1回复

如何监控以太网连接状态

对于给定的以太网连接,如何监控以太网电缆是否插入.NET? 我想枚举所有以太网连接并订阅任何连接状态更改。 我没有兴趣在检测上网,只有一个以太网连接器 是否连接 。 更新:我发现此博客文章介绍如何使用WMI查询通知断开连接。
1回复

测量以太网速度python

我正在尝试构建Python模块,该模块将监视和测量以太网速度(接收和发送)。 该模块是性能计划的一部分。 我寻找了使之成为可能的库,并且我找到的唯一库是使用以下命令的Psutil : 该命令的输出为: 所以我只是字节数,而对命令测量的时间间隔一无所知,所以我无法从中提取速度。 哪
1回复

C#PingReply在同时连接wifi和以太网时超时

我有两台计算机,分别是通过以太网电缆连接并配置了静态ips的服务器(192.168.173.1)和客户端(192.168.173.2)。 另一方面,它们都连接到相同的wifi网络(动态ip)。 当我使用命令行从服务器ping客户端时(“ ping 192.168.173.2”),我会立即得
1回复

如何在C#中仅检索以太网MAC地址

我想仅获取以太网的 MAC 地址,但有时也会显示 Wifi MAC 地址。 我试过这段代码,在调试时我发现 PC 只使用了 Wifi 网络接口类型。 但是只要拔掉以太网,代码就会起作用。 网络接口类型更改为以太网本身。
1回复

如何在不启用IP定向广播的情况下通过以太网广播WOL

我正在C#中构建Wake On Lan程序,我发现了很多WOL的代码,但是到目前为止我发现的任何东西都行不通。 我认为这是因为我无法启用IP定向广播(为了防止DOS攻击,客户的安全策略将不会启用此功能)。 我正在寻找一种通过以太网将魔术包直接发送到所请求的mac地址的方法 -现在它似乎正在
2回复

在同一系统的2个以太网端口之间发送和接收UDP帧

我的系统中有两个以太网端口,并且将它们的IP地址分别配置为10.169.20.15和10.169.20.30 。 我正在尝试通过IP地址为10.169.20.30端口从一个应用程序传输UDP帧。 在另一个应用程序中,我试图通过IP为10.169.20.15的另一个以太网端口接收帧。 传输