Phương pháp đáng tin cậy để lấy địa chỉ MAC của máy trong C #


131

Tôi cần một cách để lấy địa chỉ MAC của máy bất kể HĐH đang chạy bằng C #. Ứng dụng sẽ cần hoạt động trên XP / Vista / Win7 32 và 64 bit cũng như trên các HĐH đó nhưng với mặc định bằng tiếng nước ngoài. Nhiều lệnh C # và truy vấn HĐH không hoạt động trên HĐH. Có ý kiến ​​gì không? Tôi đã loại bỏ đầu ra của "ipconfig / all" nhưng điều này không đáng tin lắm vì định dạng đầu ra khác nhau trên mỗi máy.

Cảm ơn


7
Khi bạn nói trên hệ điều hành, bạn có nghĩa là trên các hệ điều hành khác nhau của Microsoft?
John Weldon

Câu trả lời:


136

Dung dịch sạch hơn

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

Hoặc là:

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

44
Hoặc lambda, nếu đó là điều của bạn! return NetworkInterface.GetAllNetworkInterfaces().Where(nic => nic.OperationalStatus == OperationalStatus.Up).Select(nic => nic.GetPhysicalAddress().ToString()).FirstOrDefault();(Nếu đó không phải là thứ của bạn, thì nó sẽ là thứ của bạn.)
GONeale

7
Cách 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();
súc tích

1
Chọn đầu tiên không phải luôn luôn là lựa chọn tốt nhất. Chọn kết nối được sử dụng nhiều nhất: stackoverflow.com/a/51821927/3667
Ramunas

Lưu ý tối ưu hóa: Bạn có thể gọi FirstOrDefaulttrước trận chung kết Select. Bằng cách này, nó sẽ chỉ nhận được địa chỉ vật lý và tuần tự hóa nó cho thực tế NetworkInterfacemà bạn nhận được. Đừng quên thêm kiểm tra null (?) Sau FirstOrDefault.
GregaMohorko

Một cách tính toán nhanh hơn để có được nó, bạn không cần phải đánh giá tất cả các mạng phù hợp với điều kiện nhất định, bạn chỉ cần đầu tiên trong số chúng: NetworkInterface .GetAllNetworkInterfaces() .FirstOrDefault(nic => nic.OperationalStatus == OperationalStatus.Up && nic.NetworkInterfaceType != NetworkInterfaceType.Loopback)? .GetPhysicalAddress().ToString();
Alessandro Muzzi

80

Đây là một số mã C # trả về địa chỉ MAC của giao diện mạng hoạt động đầu tiên. Giả sử NetworkInterfacelắp ráp được thực hiện trong thời gian chạy (tức là Mono) được sử dụng trên các hệ điều hành khác thì điều này sẽ hoạt động trên các hệ điều hành khác.

Phiên bản mới: trả về NIC với tốc độ nhanh nhất cũng có địa chỉ MAC hợp lệ.

/// <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;
}

Phiên bản gốc: chỉ trả về cái đầu tiên.

/// <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;
}

Điều duy nhất tôi không thích về cách tiếp cận này là nếu bạn thích một Miniport Gói của Nortel hoặc một loại kết nối VPN nào đó thì nó có khả năng được chọn. Theo như tôi có thể nói, không có cách nào để phân biệt MAC của một thiết bị vật lý thực tế với một số loại giao diện mạng ảo.


6
Đừng chỉ chọn giao diện hoạt động đầu tiên. Điều này có thể trả về giao diện Loopback, thẻ 3G được kết nối đôi khi, v.v., có lẽ không phải là điều bạn muốn. NetworkInterfaceType ( msdn.microsoft.com/en-us/l Library / trộm ) sẽ cung cấp cho bạn thêm thông tin về kết nối NetworkInterface để bạn có thể đưa ra lựa chọn sáng suốt hơn. Cũng nên nhớ rằng có thể có nhiều kết nối hoạt động trên một máy và thứ tự của chúng có thể không dự đoán được.
Dave R.

@DaveR. Tôi đã xem NetworkInterfaceType, về cơ bản, nó hầu như luôn trả về Ethernet ngay cả khi nó là một bộ điều hợp ảo theo kinh nghiệm của tôi vì vậy tôi thấy nó khá vô dụng.
blak3r

1
Bạn nên chọn Giao diện với GatewayMetric thấp nhất. Đây phải là kết nối có "tuyến đường nhanh nhất, đáng tin cậy nhất hoặc ít tốn tài nguyên nhất". Về cơ bản nó sẽ cung cấp cho bạn giao diện mà Windows thích sử dụng. Tuy nhiên, tôi nghĩ rằng bạn cần WMI để thực sự có được điều đó. Tôi sẽ xem liệu tôi có thể làm việc đó không ...
AVee

6
Để hoàn thiện, lớp using System.Net.NetworkInformation;
NetworkInterface

1
FWIW, nếu bạn đã cài đặt gigabit NIC và Hyper-V, bạn cũng sẽ có một ảo ảo 10gigabit. :) Vấn đề khó giải quyết ...
Christopher Họa sĩ

10

Các MACAddress tài sản của lớp Win32_NetworkAdapterConfiguration WMI có thể cung cấp cho bạn địa chỉ MAC của một bộ chuyển đổi. (Hệ thống quản lý không gian quản lý)

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"

Nếu bạn không quen với API WMI (Công cụ quản lý Windows), có một tổng quan tốt ở đây cho các ứng dụng .NET.

WMI có sẵn trên tất cả các phiên bản của windows với thời gian chạy .Net.

Đây là một ví dụ mã:

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 là giải pháp tốt nhất nếu máy bạn đang kết nối là máy windows, nhưng nếu bạn đang xem linux, mac hoặc loại bộ điều hợp mạng khác, thì bạn sẽ cần phải sử dụng thứ khác. Dưới đây là một số tùy chọn:

  1. Sử dụng lệnh DOS nbtstat -a. Tạo một quá trình, gọi lệnh này, phân tích đầu ra.
  2. Trước tiên, Ping IP để đảm bảo rằng NIC của bạn lưu trữ lệnh trong bảng ARP của nó, sau đó sử dụng lệnh DOS arp -a. Phân tích đầu ra của quá trình như trong tùy chọn 1.
  3. Sử dụng một cuộc gọi không được quản lý đáng sợ để sendarp trong iphlpapi.dll

Đây là một mẫu của mục số 3. Đây có vẻ là lựa chọn tốt nhất nếu WMI không phải là giải pháp khả thi:

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);
}

Để cung cấp tín dụng khi đến hạn, đây là cơ sở cho mã đó: http://www.pinvoke.net/default.aspx/iphlpapi.sendarp#


Tôi đã tìm kiếm điều tương tự như OP và đây là điều chính xác tôi cần!
Queue Hammer

Trong tùy chọn 1 và 2, bạn có nghĩa là các lệnh DOS nếu bạn đang sử dụng máy Windows và lệnh tương đương trên Linux hoặc Mac, phải không?
Raikol Amaro

8

Chúng tôi sử dụng WMI để lấy địa chỉ mac của giao diện với số liệu thấp nhất, ví dụ: các cửa sổ giao diện sẽ thích sử dụng, như thế này:

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;
}

Hoặc trong Silverlight (cần sự tin tưởng nâng cao):

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;
}

Nếu tôi chạy mã này, nó sẽ lấy địa chỉ của người đang chạy ứng dụng chứ? Có nghĩa là nó sẽ không nhận được địa chỉ IP của máy chủ nơi lưu trữ này, đúng không?
Nate Pet

Nó nhận địa chỉ MAC của Máy chủ, Máy chủ.
Tony

6

IMHO trả lại địa chỉ mac đầu tiên không phải là ý tưởng hay, đặc biệt là khi các máy ảo được lưu trữ. Do đó, tôi kiểm tra tổng gửi / nhận byte và chọn kết nối được sử dụng nhiều nhất, điều đó không hoàn hảo, nhưng phải chính xác 9/10 lần.

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

Phương pháp này sẽ xác định địa chỉ MAC của Giao diện mạng được sử dụng để kết nối với url và cổng được chỉ định.

Tất cả các câu trả lời ở đây không có khả năng đạt được mục tiêu này.

Tôi đã viết câu trả lời này nhiều năm trước (năm 2014). Vì vậy, tôi quyết định cho nó một chút "nâng mặt". Vui lòng xem phần cập nhật

    /// <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;
    }

Để gọi nó, bạn cần phải vượt qua một URL để kết nối như thế này:

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

Bạn cũng có thể chỉ định một số cổng. Nếu không được chỉ định mặc định là 80.

CẬP NHẬT:

2020

  • Đã thêm ý kiến ​​để giải thích mã.
  • Đã sửa được sử dụng với các hệ điều hành mới hơn sử dụng IPV4 được ánh xạ tới IPV6 (như windows 10).
  • Giảm làm tổ.
  • Nâng cấp mã sử dụng "var".

1
Điều này rất thú vị, tôi sẽ thử nó, vì trong trường hợp của tôi, tôi muốn khách hàng khám phá a) địa chỉ nguồn được sử dụng để liên lạc với máy chủ của tôi (nó sẽ KHÔNG nhất thiết phải qua internet) và b) địa chỉ MAC là gì là của NIC đang cung cấp địa chỉ IP này ...
Brian B

5

Bạn có thể dùng ID ID:

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

Đó không phải là địa chỉ MAC, nhưng nó là một định danh duy nhất, nếu đó là thứ bạn đang tìm kiếm.


2

Tôi thực sự thích giải pháp của AVee với chỉ số kết nối IP thấp nhất! Nhưng nếu một nic thứ hai có cùng số liệu được cài đặt, so sánh MAC có thể thất bại ...

Tốt hơn là bạn lưu trữ mô tả của giao diện với MAC. Trong các so sánh sau, bạn có thể xác định đúng nic bằng chuỗi này. Đây là một mã mẫu:

   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

giả sử tôi có TcpConnection bằng ip cục bộ 192.168.0.182. Sau đó, nếu tôi muốn biết địa chỉ mac của NIC đó, tôi sẽ gọi meothod là: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;
    }

Điều này không hiệu quả ... Tôi không khuyên bạn nên làm điều này.
Ivandro IG Jao

2

Thực sự ghét đào bới bài cũ này nhưng tôi cảm thấy câu hỏi xứng đáng với câu trả lời khác cụ thể cho windows 8-10.

Sử dụng NetworkIn information từ không gian tên Windows.Networking.Connectivity , bạn có thể lấy Id của các cửa sổ bộ điều hợp mạng đang sử dụng. Sau đó, bạn có thể nhận được Địa chỉ MAC giao diện từ GetAllNetworkInterfaces () đã đề cập trước đó.

Điều này sẽ không hoạt động trong Ứng dụng Windows Store vì NetworkInterface trong System.Net.NetworkIn information không hiển thị 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
Câu trả lời này có thể được cải thiện với một lời giải thích ngắn gọn về những gì mã làm và cách giải quyết vấn đề.
Greg the Incredious 10/07/18

1

Thay đổi blak3r mã của mình một chút. Trong trường hợp bạn có hai bộ điều hợp với cùng tốc độ. Sắp xếp theo MAC, vì vậy bạn luôn nhận được cùng một giá trị.

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được triển khai bằng nhiều DLL khác nhau bao gồm iphlpapi.dll... Googling để iphlpapitiết lộ API Win32 tương ứng được ghi lại trong MSDN.


0

Thử cái này:

    /// <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;
    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.