วิธีที่เชื่อถือได้ในการรับที่อยู่ MAC ของเครื่องใน C #


131

ฉันต้องการวิธีรับที่อยู่ MAC ของเครื่องโดยไม่คำนึงถึงระบบปฏิบัติการที่ใช้งาน C # แอปพลิเคชันจะต้องทำงานกับ XP / Vista / Win7 32 และ 64 บิตเช่นเดียวกับระบบปฏิบัติการเหล่านั้น แต่ต้องใช้ภาษาต่างประเทศเป็นค่าเริ่มต้น คำสั่ง C # และคำสั่ง OS จำนวนมากไม่สามารถใช้กับระบบปฏิบัติการได้ ความคิดใด ๆ ฉันได้คัดลอกเอาท์พุทของ "ipconfig / all" แต่มันไม่น่าเชื่อถืออย่างมากเพราะรูปแบบเอาต์พุตแตกต่างกันในทุกเครื่อง

ขอบคุณ


7
เมื่อคุณพูดข้าม OS คุณหมายถึงใน Microsoft OS ต่างกันหรือไม่?
John Weldon

คำตอบ:


136

น้ำยาทำความสะอาด

var macAddr = 
    (
        from nic in NetworkInterface.GetAllNetworkInterfaces()
        where nic.OperationalStatus == OperationalStatus.Up
        select nic.GetPhysicalAddress().ToString()
    ).FirstOrDefault();

หรือ:

String firstMacAddress = NetworkInterface
    .GetAllNetworkInterfaces()
    .Where( nic => nic.OperationalStatus == OperationalStatus.Up && nic.NetworkInterfaceType != NetworkInterfaceType.Loopback )
    .Select( nic => nic.GetPhysicalAddress().ToString() )
    .FirstOrDefault();

44
หรือแลมบ์ดาถ้านั่นคือสิ่งที่คุณต้องการ! return NetworkInterface.GetAllNetworkInterfaces().Where(nic => nic.OperationalStatus == OperationalStatus.Up).Select(nic => nic.GetPhysicalAddress().ToString()).FirstOrDefault();(หากไม่ใช่สิ่งที่คุณต้องการก็ควรเป็นของคุณ)
GONeale

7
วิธีกระชับเพื่อให้ได้เร็วที่สุด: var networks = NetworkInterface.GetAllNetworkInterfaces(); var activeNetworks = networks.Where(ni => ni.OperationalStatus == OperationalStatus.Up && ni.NetworkInterfaceType != NetworkInterfaceType.Loopback); var sortedNetworks = activeNetworks.OrderByDescending(ni => ni.Speed); return sortedNetworks.First().GetPhysicalAddress().ToString();
Graham Laight

1
การเลือกก่อนไม่ใช่ตัวเลือกที่ดีที่สุดเสมอไป การเลือกการเชื่อมต่อที่ใช้มากที่สุด: stackoverflow.com/a/51821927/3667
Ramunas

บันทึกการเพิ่มประสิทธิภาพ: คุณสามารถโทรหาก่อนสุดท้ายFirstOrDefault Selectด้วยวิธีนี้มันจะได้รับที่อยู่จริงNetworkInterfaceเท่านั้น อย่าลืมที่จะเพิ่มการตรวจสอบ null (?) FirstOrDefaultหลังจากที่
GregaMohorko

วิธีคำนวณที่เร็วกว่าเพื่อให้ได้มาซึ่งคุณไม่จำเป็นต้องประเมินเครือข่ายทั้งหมดที่ตรงกับเงื่อนไขที่กำหนดคุณต้องเป็นคนแรกของพวกเขา: NetworkInterface .GetAllNetworkInterfaces() .FirstOrDefault(nic => nic.OperationalStatus == OperationalStatus.Up && nic.NetworkInterfaceType != NetworkInterfaceType.Loopback)? .GetPhysicalAddress().ToString();
Alessandro Muzzi

80

นี่คือรหัส C # บางส่วนที่ส่งคืนที่อยู่ MAC ของส่วนต่อประสานเครือข่ายปฏิบัติงานแรก สมมติว่าNetworkInterfaceแอสเซมบลีถูกนำไปใช้ในรันไทม์ (เช่น Mono) ที่ใช้กับระบบปฏิบัติการอื่นดังนั้นนี่จะทำงานกับระบบปฏิบัติการอื่น

เวอร์ชันใหม่: ส่งคืน NIC ด้วยความเร็วที่เร็วที่สุดที่มีที่อยู่ MAC ที่ถูกต้อง

/// <summary>
/// Finds the MAC address of the NIC with maximum speed.
/// </summary>
/// <returns>The MAC address.</returns>
private string GetMacAddress()
{
    const int MIN_MAC_ADDR_LENGTH = 12;
    string macAddress = string.Empty;
    long maxSpeed = -1;

    foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
    {
        log.Debug(
            "Found MAC Address: " + nic.GetPhysicalAddress() +
            " Type: " + nic.NetworkInterfaceType);

        string tempMac = nic.GetPhysicalAddress().ToString();
        if (nic.Speed > maxSpeed &&
            !string.IsNullOrEmpty(tempMac) &&
            tempMac.Length >= MIN_MAC_ADDR_LENGTH)
        {
            log.Debug("New Max Speed = " + nic.Speed + ", MAC: " + tempMac);
            maxSpeed = nic.Speed;
            macAddress = tempMac;
        }
    }

    return macAddress;
}

เวอร์ชั่นดั้งเดิม: เพียงคืนค่าแรก

/// <summary>
/// Finds the MAC address of the first operation NIC found.
/// </summary>
/// <returns>The MAC address.</returns>
private string GetMacAddress()
{
    string macAddresses = string.Empty;

    foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
    {
        if (nic.OperationalStatus == OperationalStatus.Up)
        {
            macAddresses += nic.GetPhysicalAddress().ToString();
            break;
        }
    }

    return macAddresses;
}

สิ่งเดียวที่ฉันไม่ชอบเกี่ยวกับวิธีนี้คือถ้าคุณมีเหมือน Nortel Packet Miniport หรือการเชื่อมต่อ VPN บางประเภทมันมีศักยภาพที่จะถูกเลือก เท่าที่ฉันสามารถบอกได้ว่าไม่มีวิธีแยกแยะ MAC ของอุปกรณ์ทางกายภาพจริงจากอินเทอร์เฟซเครือข่ายเสมือนบางประเภท


6
อย่าเพิ่งเลือกอินเทอร์เฟซการปฏิบัติตัวแรก นี่อาจส่งคืนอินเทอร์เฟซแบบวนกลับการ์ด 3G ที่เชื่อมต่อเป็นครั้งคราวและอื่น ๆ ซึ่งอาจไม่ใช่สิ่งที่คุณต้องการ NetworkInterfaceType ( msdn.microsoft.com/en-us/library/… ) จะให้ข้อมูลเพิ่มเติมเกี่ยวกับการเชื่อมต่อ NetworkInterface เพื่อให้คุณสามารถเลือกข้อมูลได้มากขึ้น โปรดจำไว้ว่าอาจมีการเชื่อมต่อที่ใช้งานอยู่จำนวนมากบนเครื่องและลำดับของพวกเขาอาจไม่สามารถคาดเดาได้
เดฟอา

@DaveR ฉันดูที่ NetworkInterfaceType โดยทั่วไปแล้วมันจะส่งคืนอีเทอร์เน็ตเกือบทุกครั้งแม้จะเป็นอะแดปเตอร์เสมือนจริงในประสบการณ์ของฉันดังนั้นฉันจึงพบว่ามันไร้ประโยชน์
blak3r

1
คุณควรเลือก Interface ด้วย GatewayMetric ที่ต่ำที่สุด นี่ควรเป็นการเชื่อมต่อที่มี "เส้นทางที่เร็วที่สุดน่าเชื่อถือที่สุดหรือใช้ทรัพยากรน้อยที่สุด" โดยทั่วไปจะให้อินเตอร์เฟสที่ Windows ต้องการใช้ อย่างไรก็ตามฉันคิดว่าคุณต้องการ WMI เพื่อรับสิ่งนั้นจริงๆ ฉันจะดูว่าฉันจะได้รับว่าในการทำงาน ...
Avee

6
เพื่อความสมบูรณ์คลาส NetworkInterface สามารถเข้าถึงได้ด้วยusing System.Net.NetworkInformation;
iancoleman

1
FWIW ถ้าคุณติดตั้งกิกะบิต NIC และ Hyper-V คุณจะมี NIC เสมือน 10gigabit :) ปัญหายากที่จะแก้ ...
Christopher Painter

10

MacAddressทรัพย์สินของระดับ Win32_NetworkAdapterConfiguration WMIสามารถให้คุณมีที่อยู่ MAC อะแดปเตอร์ฯ (ระบบจัดการชื่อเนมสเปซ)

MACAddress

    Data type: string
    Access type: Read-only

    Media Access Control (MAC) address of the network adapter. A MAC address is assigned by the manufacturer to uniquely identify the network adapter.

    Example: "00:80:C7:8F:6C:96"

หากคุณไม่คุ้นเคยกับ WMI API (Windows Management Instrumentation) มีภาพรวมที่ดีสำหรับแอป. NET

WMI สามารถใช้ได้กับ windows ทุกรุ่นด้วย. Net runtime

นี่คือตัวอย่างรหัส:

System.Management.ManagementClass mc = default(System.Management.ManagementClass);
ManagementObject mo = default(ManagementObject);
mc = new ManagementClass("Win32_NetworkAdapterConfiguration");

ManagementObjectCollection moc = mc.GetInstances();
    foreach (var mo in moc) {
        if (mo.Item("IPEnabled") == true) {
              Adapter.Items.Add("MAC " + mo.Item("MacAddress").ToString());
         }
     }

9

WMI เป็นทางออกที่ดีที่สุดหากเครื่องที่คุณเชื่อมต่อเป็นเครื่อง windows แต่ถ้าคุณดูที่ linux, mac หรืออะแดปเตอร์เครือข่ายประเภทอื่นคุณจะต้องใช้อย่างอื่น นี่คือตัวเลือกบางส่วน:

  1. ใช้คำสั่ง DOS nbtstat -a สร้างกระบวนการเรียกคำสั่งนี้แยกวิเคราะห์ผลลัพธ์
  2. ก่อนอื่นให้ Ping IP เพื่อให้แน่ใจว่า NIC ของคุณแคชคำสั่งในตาราง ARP จากนั้นใช้คำสั่ง DOS arp -a แยกวิเคราะห์ผลลัพธ์ของกระบวนการเช่นเดียวกับในตัวเลือก 1
  3. ใช้การเรียกที่ไม่ได้รับการจัดการไปยัง sendarp ใน iphlpapi.dll

นี่คือตัวอย่างของรายการ # 3 นี่น่าจะเป็นตัวเลือกที่ดีที่สุดถ้า WMI ไม่ใช่โซลูชันที่ทำงานได้:

using System.Runtime.InteropServices;
...
[DllImport("iphlpapi.dll", ExactSpelling = true)]
        public static extern int SendARP(int DestIP, int SrcIP, byte[] pMacAddr, ref uint PhyAddrLen);
...
private string GetMacUsingARP(string IPAddr)
{
    IPAddress IP = IPAddress.Parse(IPAddr);
    byte[] macAddr = new byte[6];
    uint macAddrLen = (uint)macAddr.Length;

    if (SendARP((int)IP.Address, 0, macAddr, ref macAddrLen) != 0)
        throw new Exception("ARP command failed");

    string[] str = new string[(int)macAddrLen];
    for (int i = 0; i < macAddrLen; i++)
        str[i] = macAddr[i].ToString("x2");

    return string.Join(":", str);
}

ในการให้เครดิตในกรณีที่ถึงกำหนดชำระเงินนี่เป็นพื้นฐานสำหรับรหัสนั้น: http://www.pinvoke.net/default.aspx/iphlpapi.sendarp#


ฉันกำลังมองหาสิ่งเดียวกันกับ OP และนี่คือสิ่งที่ฉันต้องการ!
QueueHammer

ในตัวเลือกที่ 1 และ 2 คุณหมายถึงคำสั่ง DOS หากคุณใช้เครื่อง windows และคำสั่งเทียบเท่าบน Linux หรือ Mac ใช่ไหม
Raikol Amaro

8

เราใช้ WMI เพื่อรับที่อยู่ mac ของอินเทอร์เฟซที่มีเมตริกต่ำสุดเช่นหน้าต่างอินเทอร์เฟซที่ต้องการใช้เช่นนี้:

public static string GetMACAddress()
{
    ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapterConfiguration where IPEnabled=true");
    IEnumerable<ManagementObject> objects = searcher.Get().Cast<ManagementObject>();
    string mac = (from o in objects orderby o["IPConnectionMetric"] select o["MACAddress"].ToString()).FirstOrDefault();
    return mac;
}

หรือใน Silverlight (ต้องการความไว้วางใจที่สูง):

public static string GetMACAddress()
{
    string mac = null;
    if ((Application.Current.IsRunningOutOfBrowser) && (Application.Current.HasElevatedPermissions) && (AutomationFactory.IsAvailable))
    {
        dynamic sWbemLocator = AutomationFactory.CreateObject("WbemScripting.SWBemLocator");
        dynamic sWbemServices = sWbemLocator.ConnectServer(".");
        sWbemServices.Security_.ImpersonationLevel = 3; //impersonate

        string query = "SELECT * FROM Win32_NetworkAdapterConfiguration where IPEnabled=true";
        dynamic results = sWbemServices.ExecQuery(query);

        int mtu = int.MaxValue;
        foreach (dynamic result in results)
        {
            if (result.IPConnectionMetric < mtu)
            {
                mtu = result.IPConnectionMetric;
                mac = result.MACAddress;
            }
        }
    }
    return mac;
}

7
public static PhysicalAddress GetMacAddress()
{
    var myInterfaceAddress = NetworkInterface.GetAllNetworkInterfaces()
        .Where(n => n.OperationalStatus == OperationalStatus.Up && n.NetworkInterfaceType != NetworkInterfaceType.Loopback)
        .OrderByDescending(n => n.NetworkInterfaceType == NetworkInterfaceType.Ethernet)
        .Select(n => n.GetPhysicalAddress())
        .FirstOrDefault();

    return myInterfaceAddress;
}

ถ้าฉันใช้รหัสนี้มันจะได้รับที่อยู่ของผู้ที่เรียกใช้แอปพลิเคชันหรือไม่ หมายความว่าจะไม่ได้รับที่อยู่ IP ของเซิร์ฟเวอร์ซึ่งโฮสต์ที่นี่ใช่ไหม
Nate Pet

ได้รับที่อยู่ MAC ของเครื่องโฮสต์เซิร์ฟเวอร์
โทนี่

6

IMHO ที่ส่งคืนที่อยู่ Mac แรกไม่ใช่ความคิดที่ดีโดยเฉพาะเมื่อมีการโฮสต์เครื่องเสมือน ดังนั้นฉันจึงตรวจสอบการส่ง / รับผลรวมไบต์และเลือกการเชื่อมต่อที่ใช้มากที่สุดซึ่งไม่สมบูรณ์ แต่ควรถูกต้อง 9/10 ครั้ง

public string GetDefaultMacAddress()
{
    Dictionary<string, long> macAddresses = new Dictionary<string, long>();
    foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
    {
        if (nic.OperationalStatus == OperationalStatus.Up)
            macAddresses[nic.GetPhysicalAddress().ToString()] = nic.GetIPStatistics().BytesSent + nic.GetIPStatistics().BytesReceived;
    }
    long maxValue = 0;
    string mac = "";
    foreach(KeyValuePair<string, long> pair in macAddresses)
    {
        if (pair.Value > maxValue)
        {
            mac = pair.Key;
            maxValue = pair.Value;
        }
    }
    return mac;
}

6

วิธีนี้จะกำหนดที่อยู่ MAC ของ Network Interface ที่ใช้เชื่อมต่อกับ url และพอร์ตที่ระบุ

คำตอบทั้งหมดที่นี่ไม่สามารถบรรลุเป้าหมายนี้ได้

ฉันเขียนคำตอบนี้เมื่อหลายปีก่อน (ในปี 2014) ดังนั้นฉันจึงตัดสินใจให้ "ยกกระชับใบหน้า" เล็กน้อย โปรดดูที่ส่วนการอัพเดท

    /// <summary>
    /// Get the MAC of the Netowrk Interface used to connect to the specified url.
    /// </summary>
    /// <param name="allowedURL">URL to connect to.</param>
    /// <param name="port">The port to use. Default is 80.</param>
    /// <returns></returns>
    private static PhysicalAddress GetCurrentMAC(string allowedURL, int port = 80)
    {
        //create tcp client
        var client = new TcpClient();

        //start connection
        client.Client.Connect(new IPEndPoint(Dns.GetHostAddresses(allowedURL)[0], port));

        //wai while connection is established
        while(!client.Connected)
        {
            Thread.Sleep(500);
        }

        //get the ip address from the connected endpoint
        var ipAddress = ((IPEndPoint)client.Client.LocalEndPoint).Address;

        //if the ip is ipv4 mapped to ipv6 then convert to ipv4
        if(ipAddress.IsIPv4MappedToIPv6)
            ipAddress = ipAddress.MapToIPv4();        

        Debug.WriteLine(ipAddress);

        //disconnect the client and free the socket
        client.Client.Disconnect(false);
        
        //this will dispose the client and close the connection if needed
        client.Close();

        var allNetworkInterfaces = NetworkInterface.GetAllNetworkInterfaces();

        //return early if no network interfaces found
        if(!(allNetworkInterfaces?.Length > 0))
            return null;

        foreach(var networkInterface in allNetworkInterfaces)
        {
            //get the unicast address of the network interface
            var unicastAddresses = networkInterface.GetIPProperties().UnicastAddresses;
           
            //skip if no unicast address found
            if(!(unicastAddresses?.Count > 0))
                continue;

            //compare the unicast addresses to see 
            //if any match the ip address used to connect over the network
            for(var i = 0; i < unicastAddresses.Count; i++)
            {
                var unicastAddress = unicastAddresses[i];

                //this is unlikely but if it is null just skip
                if(unicastAddress.Address == null)
                    continue;
                
                var ipAddressToCompare = unicastAddress.Address;

                Debug.WriteLine(ipAddressToCompare);

                //if the ip is ipv4 mapped to ipv6 then convert to ipv4
                if(ipAddressToCompare.IsIPv4MappedToIPv6)
                    ipAddressToCompare = ipAddressToCompare.MapToIPv4();

                Debug.WriteLine(ipAddressToCompare);

                //skip if the ip does not match
                if(!ipAddressToCompare.Equals(ipAddress))
                    continue;

                //return the mac address if the ip matches
                return networkInterface.GetPhysicalAddress();
            }
              
        }

        //not found so return null
        return null;
    }

ในการโทรหาคุณจะต้องส่ง URL เพื่อเชื่อมต่อกับสิ่งนี้:

var mac = GetCurrentMAC("www.google.com");

คุณสามารถระบุหมายเลขพอร์ตได้ หากไม่ได้ระบุค่าเริ่มต้นคือ 80

ปรับปรุง:

2020

  • เพิ่มความคิดเห็นเพื่ออธิบายรหัส
  • แก้ไขแล้วให้ใช้กับระบบปฏิบัติการรุ่นใหม่ที่ใช้ IPV4 ที่แมปกับ IPV6 (เช่น windows 10)
  • ลดการทำรัง
  • อัปเกรดรหัสให้ใช้ "var"

1
นี่เป็นเรื่องที่น่าสนใจมากฉันจะลองทำเช่นเดียวกับในกรณีของฉันฉันต้องการให้ลูกค้าค้นพบ) ที่อยู่ต้นทางที่ใช้ในการสื่อสารกับเซิร์ฟเวอร์ของฉัน (ไม่จำเป็นต้องอยู่บนอินเทอร์เน็ต) และ b) ที่อยู่ MAC เป็นของ NIC ที่ให้ที่อยู่ IP นี้ ...
Brian B

5

คุณสามารถไปรับ NIC ID ได้:

 foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces()) {
     if (nic.OperationalStatus == OperationalStatus.Up){
         if (nic.Id == "yay!")
     }
 }

ไม่ใช่ที่อยู่ MAC แต่เป็นตัวระบุที่ไม่ซ้ำใครหากนั่นคือสิ่งที่คุณกำลังมองหา


2

ฉันชอบโซลูชันของ AVee ที่มีการวัดการเชื่อมต่อ IP ต่ำที่สุด! แต่ถ้าติดตั้ง nic ตัวที่สองที่มีเมทริกเดียวกันการเปรียบเทียบ MAC อาจล้มเหลว ...

ดีกว่าที่คุณเก็บคำอธิบายของอินเทอร์เฟซด้วย MAC ในการเปรียบเทียบในภายหลังคุณสามารถระบุ nic ที่ถูกต้องโดยสตริงนี้ นี่คือตัวอย่างรหัส:

   public static string GetMacAndDescription()
    {
        ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapterConfiguration where IPEnabled=true");
        IEnumerable<ManagementObject> objects = searcher.Get().Cast<ManagementObject>();
        string mac = (from o in objects orderby o["IPConnectionMetric"] select o["MACAddress"].ToString()).FirstOrDefault();
        string description = (from o in objects orderby o["IPConnectionMetric"] select o["Description"].ToString()).FirstOrDefault();
        return mac + ";" + description;
    }

    public static string GetMacByDescription( string description)
    {
        ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapterConfiguration where IPEnabled=true");
        IEnumerable<ManagementObject> objects = searcher.Get().Cast<ManagementObject>();
        string mac = (from o in objects where o["Description"].ToString() == description select o["MACAddress"].ToString()).FirstOrDefault();
        return mac;
    }

2

สมมติว่าฉันมี TcpConnection โดยใช้ไอพีท้องถิ่นของฉันที่ 192.168.0.182 ถ้าฉันต้องการทราบที่อยู่ mac ของ NIC นั้นฉันจะเรียก meothod เป็น:GetMacAddressUsedByIp("192.168.0.182")

public static string GetMacAddressUsedByIp(string ipAddress)
    {
        var ips = new List<string>();
        string output;

        try
        {
            // Start the child process.
            Process p = new Process();
            // Redirect the output stream of the child process.
            p.StartInfo.UseShellExecute = false;

            p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.CreateNoWindow = true;
            p.StartInfo.FileName = "ipconfig";
            p.StartInfo.Arguments = "/all";
            p.Start();
            // Do not wait for the child process to exit before
            // reading to the end of its redirected stream.
            // p.WaitForExit();
            // Read the output stream first and then wait.
            output = p.StandardOutput.ReadToEnd();
            p.WaitForExit();

        }
        catch
        {
            return null;
        }

        // pattern to get all connections
        var pattern = @"(?xis) 
(?<Header>
     (\r|\n) [^\r]+ :  \r\n\r\n
)
(?<content>
    .+? (?= ( (\r\n\r\n)|($)) )
)";

        List<Match> matches = new List<Match>();

        foreach (Match m in Regex.Matches(output, pattern))
            matches.Add(m);

        var connection = matches.Select(m => new
        {
            containsIp = m.Value.Contains(ipAddress),
            containsPhysicalAddress = Regex.Match(m.Value, @"(?ix)Physical \s Address").Success,
            content = m.Value
        }).Where(x => x.containsIp && x.containsPhysicalAddress)
        .Select(m => Regex.Match(m.content, @"(?ix)  Physical \s address [^:]+ : \s* (?<Mac>[^\s]+)").Groups["Mac"].Value).FirstOrDefault();

        return connection;
    }

มันไม่มีประสิทธิภาพ ... ฉันไม่แนะนำให้ทำเช่นนี้
Ivandro IG Jao

2

เกลียดการขุดโพสต์เก่านี้จริง ๆ แต่ฉันรู้สึกว่าคำถามสมควรได้รับคำตอบเฉพาะสำหรับ windows 8-10 อีก

การใช้NetworkInformationจากWindows.Networking.Connectivity namespace คุณจะได้รับ Id ของหน้าต่างอะแดปเตอร์เครือข่ายที่ใช้งานอยู่ จากนั้นคุณจะได้รับอินเตอร์เฟส MAC Address จาก GetAllNetworkInterfaces ที่กล่าวถึงก่อนหน้านี้

สิ่งนี้จะไม่ทำงานใน Windows Store Apps เนื่องจากNetworkInterfaceใน System.Net.NetworkInformation ไม่เปิดเผย GetAllNetworkInterfaces

string GetMacAddress()
{
    var connectionProfile = NetworkInformation.GetInternetConnectionProfile();
    if (connectionProfile == null) return "";

    var inUseId = connectionProfile.NetworkAdapter.NetworkAdapterId.ToString("B").ToUpperInvariant();
    if(string.IsNullOrWhiteSpace(inUseId)) return "";

    var mac = NetworkInterface.GetAllNetworkInterfaces()
        .Where(n => inUseId == n.Id)
        .Select(n => n.GetPhysicalAddress().GetAddressBytes().Select(b=>b.ToString("X2")))
        .Select(macBytes => string.Join(" ", macBytes))
        .FirstOrDefault();

    return mac;
}

2
string mac = "";
foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
            {

                if (nic.OperationalStatus == OperationalStatus.Up && (!nic.Description.Contains("Virtual") && !nic.Description.Contains("Pseudo")))
                {
                    if (nic.GetPhysicalAddress().ToString() != "")
                    {
                        mac = nic.GetPhysicalAddress().ToString();
                    }
                }
            }
MessageBox.Show(mac);

2
คำตอบนี้สามารถปรับปรุงได้ด้วยคำอธิบายสั้น ๆ เกี่ยวกับสิ่งที่รหัสทำและวิธีแก้ปัญหา
Greg the Incredulous

1

เปลี่ยน blak3r โค้ดของเขาเล็กน้อย ในกรณีที่คุณมีอะแดปเตอร์สองตัวที่มีความเร็วเท่ากัน จัดเรียงตาม MAC ดังนั้นคุณจะได้รับค่าเดิมเสมอ

public string GetMacAddress()
{
    const int MIN_MAC_ADDR_LENGTH = 12;
    string macAddress = string.Empty;
    Dictionary<string, long> macPlusSpeed = new Dictionary<string, long>();
    try
    {
        foreach(NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
        {
            System.Diagnostics.Debug.WriteLine("Found MAC Address: " + nic.GetPhysicalAddress() + " Type: " + nic.NetworkInterfaceType);

            string tempMac = nic.GetPhysicalAddress().ToString();

            if(!string.IsNullOrEmpty(tempMac) && tempMac.Length >= MIN_MAC_ADDR_LENGTH)
                macPlusSpeed.Add(tempMac, nic.Speed);
        }

        macAddress = macPlusSpeed.OrderByDescending(row => row.Value).ThenBy(row => row.Key).FirstOrDefault().Key;
    }
    catch{}

    System.Diagnostics.Debug.WriteLine("Fastest MAC address: " + macAddress);

    return macAddress;
}

1
foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
{
     if (nic.OperationalStatus == OperationalStatus.Up)
     {
            PhysicalAddress Mac = nic.GetPhysicalAddress();
     }
}

0

ipconfig.exeมีการใช้งาน DLLs ต่าง ๆ รวมถึงiphlpapi.dll... Googling for iphlpapiเผยให้เห็น Win32 API ที่สอดคล้องกันซึ่งบันทึกไว้ใน MSDN


0

ลองสิ่งนี้:

    /// <summary>
    /// returns the first MAC address from where is executed 
    /// </summary>
    /// <param name="flagUpOnly">if sets returns only the nic on Up status</param>
    /// <returns></returns>
    public static string[] getOperationalMacAddresses(Boolean flagUpOnly)
    {
        string[] macAddresses = new string[NetworkInterface.GetAllNetworkInterfaces().Count()];

        int i = 0;
        foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
        {
            if (nic.OperationalStatus == OperationalStatus.Up || !flagUpOnly)
            {
                macAddresses[i] += ByteToHex(nic.GetPhysicalAddress().GetAddressBytes());
                //break;
                i++;
            }
        }
        return macAddresses;
    }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.