C# - 在通用应用程序中获取 mac 地址 [英] C# - Get mac address in Universal Apps

查看:28
本文介绍了C# - 在通用应用程序中获取 mac 地址的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在开发 Windows 10 通用应用程序,我需要获取将运行通用应用程序的设备的网络适配器的 mac 地址.我查看了 MSDN,但我可以找到一种获取 mac 地址的方法,有人可以帮助我使用代码获取 Windows 10 通用应用程序中网络适配器的 mac 地址吗?

I am developing a Windows 10 Universal App, and I need to get the mac address of the network adapters of the device on which the universal app will run. I looked a bit into MSDN but I could find a way to get the mac address, can anyone help me out with the code to get the mac address of network adapters in universal apps for windows 10?

提前致谢.

推荐答案

嗯,我写了一些东西,但我没有在移动设备上测试它,因为我目前没有,但我在我的 PC 和 Windows 上测试了它移动 10 模拟器.

Hmmm I wrote something but I didn't tested it on mobile device because I don't have any at the moment but I tested it on my PC and Windows Mobile 10 emulator.

public static class AdaptersHelper
{
    const int MAX_ADAPTER_DESCRIPTION_LENGTH = 128;
    const int ERROR_BUFFER_OVERFLOW = 111;
    const int MAX_ADAPTER_NAME_LENGTH = 256;
    const int MAX_ADAPTER_ADDRESS_LENGTH = 8;
    const int MIB_IF_TYPE_OTHER = 1;
    const int MIB_IF_TYPE_ETHERNET = 6;
    const int MIB_IF_TYPE_TOKENRING = 9;
    const int MIB_IF_TYPE_FDDI = 15;
    const int MIB_IF_TYPE_PPP = 23;
    const int MIB_IF_TYPE_LOOPBACK = 24;
    const int MIB_IF_TYPE_SLIP = 28;

    [DllImport("iphlpapi.dll", CharSet = CharSet.Ansi, ExactSpelling = true)]
    public static extern int GetAdaptersInfo(IntPtr pAdapterInfo, ref Int64 pBufOutLen);

    public static List<AdapterInfo> GetAdapters()
    {
        var adapters = new List<AdapterInfo>();

        long structSize = Marshal.SizeOf(typeof(IP_ADAPTER_INFO));
        IntPtr pArray = Marshal.AllocHGlobal(new IntPtr(structSize));

        int ret = GetAdaptersInfo(pArray, ref structSize);

        if (ret == ERROR_BUFFER_OVERFLOW) // ERROR_BUFFER_OVERFLOW == 111
        {
            // Buffer was too small, reallocate the correct size for the buffer.
            pArray = Marshal.ReAllocHGlobal(pArray, new IntPtr(structSize));

            ret = GetAdaptersInfo(pArray, ref structSize);
        }

        if (ret == 0)
        {
            // Call Succeeded
            IntPtr pEntry = pArray;

            do
            {
                var adapter = new AdapterInfo();

                // Retrieve the adapter info from the memory address
                var entry = (IP_ADAPTER_INFO)Marshal.PtrToStructure(pEntry, typeof(IP_ADAPTER_INFO));

                // Adapter Type
                switch (entry.Type)
                {
                    case MIB_IF_TYPE_ETHERNET:
                        adapter.Type = "Ethernet";
                        break;
                    case MIB_IF_TYPE_TOKENRING:
                        adapter.Type = "Token Ring";
                        break;
                    case MIB_IF_TYPE_FDDI:
                        adapter.Type = "FDDI";
                        break;
                    case MIB_IF_TYPE_PPP:
                        adapter.Type = "PPP";
                        break;
                    case MIB_IF_TYPE_LOOPBACK:
                        adapter.Type = "Loopback";
                        break;
                    case MIB_IF_TYPE_SLIP:
                        adapter.Type = "Slip";
                        break;
                    default:
                        adapter.Type = "Other/Unknown";
                        break;
                } // switch

                adapter.Name = entry.AdapterName;
                adapter.Description = entry.AdapterDescription;

                // MAC Address (data is in a byte[])
                adapter.MAC = string.Join("-", Enumerable.Range(0, (int)entry.AddressLength).Select(s => string.Format("{0:X2}", entry.Address[s])));

                // Get next adapter (if any)

                adapters.Add(adapter);

                pEntry = entry.Next;
            }
            while (pEntry != IntPtr.Zero);

            Marshal.FreeHGlobal(pArray);
        }
        else
        {
            Marshal.FreeHGlobal(pArray);
            throw new InvalidOperationException("GetAdaptersInfo failed: " + ret);
        }

        return adapters;
    }

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
    public struct IP_ADAPTER_INFO
    {
        public IntPtr Next;
        public Int32 ComboIndex;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_ADAPTER_NAME_LENGTH + 4)]
        public string AdapterName;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_ADAPTER_DESCRIPTION_LENGTH + 4)]
        public string AdapterDescription;
        public UInt32 AddressLength;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = MAX_ADAPTER_ADDRESS_LENGTH)]
        public byte[] Address;
        public Int32 Index;
        public UInt32 Type;
        public UInt32 DhcpEnabled;
        public IntPtr CurrentIpAddress;
        public IP_ADDR_STRING IpAddressList;
        public IP_ADDR_STRING GatewayList;
        public IP_ADDR_STRING DhcpServer;
        public bool HaveWins;
        public IP_ADDR_STRING PrimaryWinsServer;
        public IP_ADDR_STRING SecondaryWinsServer;
        public Int32 LeaseObtained;
        public Int32 LeaseExpires;
    }

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
    public struct IP_ADDR_STRING
    {
        public IntPtr Next;
        public IP_ADDRESS_STRING IpAddress;
        public IP_ADDRESS_STRING IpMask;
        public Int32 Context;
    }

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
    public struct IP_ADDRESS_STRING
    {
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
        public string Address;
    }
}

还有我的 AdapterInfo 类:

And my AdapterInfo class:

public class AdapterInfo
{
    public string Type { get; set; }

    public string Description { get; set; }

    public string Name { get; set; }

    public string MAC { get; set; }
}

来源:http://www.pinvoke.net/default.aspx/iphlpapi/GetAdaptersInfo.html

这篇关于C# - 在通用应用程序中获取 mac 地址的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆