獲取Wifi的InterfaceGuid

internal class Program
    {
        static void Main(string[] args)
        {
            //ShowNetworkInterfaces();
            wifi.EnumerateAvailableNetwork();
        }
        public static void ShowNetworkInterfaces()
        {
            IPGlobalProperties computerProperties = IPGlobalProperties.GetIPGlobalProperties();
            NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();
            Console.WriteLine("Interface information for {0}.{1}     ",
                    computerProperties.HostName, computerProperties.DomainName);
            if (nics == null || nics.Length < 1)
            {
                Console.WriteLine("  No network interfaces found.");
                return;
            }

            Console.WriteLine("  Number of interfaces .................... : {0}", nics.Length);
            foreach (NetworkInterface adapter in nics)
            {
                IPInterfaceProperties properties = adapter.GetIPProperties();
                Console.WriteLine();
                Console.WriteLine(adapter.Description);
                Console.WriteLine(String.Empty.PadLeft(adapter.Description.Length, '='));
                Console.WriteLine("  Interface type .......................... : {0}", adapter.NetworkInterfaceType);
                Console.WriteLine("  Physical Address ........................ : {0}",
                           adapter.GetPhysicalAddress().ToString());
                Console.WriteLine("  Operational status ...................... : {0}",
                    adapter.OperationalStatus);
                string versions = "";

                // Create a display string for the supported IP versions. 
                if (adapter.Supports(NetworkInterfaceComponent.IPv4))
                {
                    versions = "IPv4";
                }
                if (adapter.Supports(NetworkInterfaceComponent.IPv6))
                {
                    if (versions.Length > 0)
                    {
                        versions += " ";
                    }
                    versions += "IPv6";
                }
                Console.WriteLine("  IP version .............................. : {0}", versions);
                //ShowIPAddresses(properties);

                // The following information is not useful for loopback adapters. 
                if (adapter.NetworkInterfaceType == NetworkInterfaceType.Loopback)
                {
                    continue;
                }
                Console.WriteLine("  DNS suffix .............................. : {0}",
                    properties.DnsSuffix);

                string label;
                if (adapter.Supports(NetworkInterfaceComponent.IPv4))
                {
                    IPv4InterfaceProperties ipv4 = properties.GetIPv4Properties();
                    Console.WriteLine("  MTU...................................... : {0}", ipv4.Mtu);
                    if (ipv4.UsesWins)
                    {

                        IPAddressCollection winsServers = properties.WinsServersAddresses;
                        if (winsServers.Count > 0)
                        {
                            label = "  WINS Servers ............................ :";
                            //ShowIPAddresses(label, winsServers);
                        }
                    }
                }

                Console.WriteLine("  DNS enabled ............................. : {0}",
                    properties.IsDnsEnabled);
                Console.WriteLine("  Dynamically configured DNS .............. : {0}",
                    properties.IsDynamicDnsEnabled);
                Console.WriteLine("  Receive Only ............................ : {0}",
                    adapter.IsReceiveOnly);
                Console.WriteLine("  Multicast ............................... : {0}",
                    adapter.SupportsMulticast);
                //ShowInterfaceStatistics(adapter);

                Console.WriteLine();
            }
        }


        public class wifi
        {
            /// <summary>
            /// 打開一個wifi句柄
            /// </summary>
            /// <param name="dwClientVersion">版本號</param>
            /// <param name="pReserved">保留</param>
            /// <param name="pdwNegotiatedVersion">支持的最高版本(輸出)</param>
            /// <param name="ClientHandle">句柄(要得到的)以後的句柄一般都是這個</param>
            /// <returns></returns>
            [DllImport("Wlanapi", EntryPoint = "WlanOpenHandle")]
            public static extern uint WlanOpenHandle(uint dwClientVersion, IntPtr pReserved, [Out] out uint pdwNegotiatedVersion, ref IntPtr ClientHandle);
            /// <summary>
            /// 關閉打開的句柄
            /// </summary>
            /// <param name="hClientHandle">句柄</param>
            /// <param name="pReserved">保留</param>
            /// <returns></returns>
            [DllImport("Wlanapi", EntryPoint = "WlanCloseHandle")]
            public static extern uint WlanCloseHandle([In] IntPtr hClientHandle, IntPtr pReserved);
            /// <summary>
            /// 列舉無線網絡適配器
            /// </summary>
            /// <param name="hClientHandle">句柄</param>
            /// <param name="pReserved">保留</param>
            /// <param name="ppInterfaceList">數據指針(非託管)</param>
            /// <returns></returns>
            [DllImport("Wlanapi", EntryPoint = "WlanEnumInterfaces")]
            public static extern uint WlanEnumInterfaces([In] IntPtr hClientHandle, IntPtr pReserved, ref IntPtr ppInterfaceList);
            /// <summary>
            /// 釋放內存
            /// </summary>
            /// <param name="pMemory">要釋放的內存起始地址</param>
            [DllImport("Wlanapi", EntryPoint = "WlanFreeMemory")]
            public static extern void WlanFreeMemory([In] IntPtr pMemory);
            /// <summary>
            /// 獲得可見的無線網絡
            /// </summary>
            /// <param name="hClientHandle">句柄</param>
            /// <param name="pInterfaceGuid">適配器的guid號</param>
            /// <param name="dwFlags">標誌位</param>
            /// <param name="pReserved">保留</param>
            /// <param name="ppAvailableNetworkList">無線網絡的內存起始地址(非託管)</param>
            /// <returns></returns>
            [DllImport("Wlanapi", EntryPoint = "WlanGetAvailableNetworkList")]
            public static extern uint WlanGetAvailableNetworkList(IntPtr hClientHandle, ref Guid pInterfaceGuid, uint dwFlags, IntPtr pReserved, ref IntPtr ppAvailableNetworkList);
            /// <summary>
            /// 網絡適配器的狀態
            /// </summary>
            public enum WLAN_INTERFACE_STATE
            {
                WLAN_INTERFACE_STATE_NOT_READY = 0,
                WLAN_INTERFACE_STATE_CONNECTED = 1,
                WLAN_INTERFACE_STATE_AD_HOC_NETWORK_FORMED = 2,
                WLAN_INTERFACE_STATE_DISCONNECTING = 3,
                WLAN_INTERFACE_STATE_DISCONNECTED = 4,
                WLAN_INTERFACE_STATE_ASSOCIATING = 5,
                WLAN_INTERFACE_STATE_DISCOVERING = 6,
                WLAN_INTERFACE_STATE_AUTHENTICATING = 7
            }
            /// <summary>
            /// 一個適配器的信息
            /// </summary>
            [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
            public struct WLAN_INTERFACE_INFO
            {
                ///GUID->_GUID
                public Guid InterfaceGuid;//Guid自動生成代碼
                ///WCHAR[256]
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
                public string strInterfaceDescription;
                ///WLAN_INTERFACE_STATE
                public WLAN_INTERFACE_STATE isState;
            }
            /// <summary>
            /// 包含所有適配器
            /// </summary>
            [StructLayout(LayoutKind.Sequential)]
            public struct WLAN_INTERFACE_INFO_LIST //struct結構
            {
                public Int32 dwNumberOfItems;
                public Int32 dwIndex;
                public WLAN_INTERFACE_INFO[] InterfaceInfo;
                public WLAN_INTERFACE_INFO_LIST(IntPtr pList)
                {
                    dwNumberOfItems = Marshal.ReadInt32(pList, 0);
                    dwIndex = Marshal.ReadInt32(pList, 4);
                    InterfaceInfo = new WLAN_INTERFACE_INFO[dwNumberOfItems];
                    for (int i = 0; i < dwNumberOfItems; i++)
                    {
                        IntPtr pItemList = new IntPtr(pList.ToInt32() + (i * 532) + 8);
                        WLAN_INTERFACE_INFO wii = new WLAN_INTERFACE_INFO();
                        wii = (WLAN_INTERFACE_INFO)Marshal.PtrToStructure(pItemList, typeof(WLAN_INTERFACE_INFO));
                        InterfaceInfo[i] = wii;
                    }
                }
            }
            /// <summary>
            /// 服務器標誌(子網絡標誌號)
            /// </summary>
            [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
            public struct DOT11_SSID
            {
                public uint uSSIDLength;
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
                public string ucSSID;
            }
            /// <summary>
            /// BSS類型
            /// </summary>
            public enum DOT11_BSS_TYPE
            {
                DOT11_BSS_TYPE_INFRASTRUCTURE = 1,
                DOT11_BSS_TYPE_INDEPENDENT = 2,
                DOT11_BSS_TYPE_ANY = 3
            }
            public enum DOT11_PHY_TYPE
            {
                DOT11_PHY_TYPE_UNKNOWN = 1,
                DOT11_PHY_TYPE_ANY,
                DOT11_PHY_TYPE_FHSS,
                DOT11_PHY_TYPE_DSSS,
                DOT11_PHY_TYPE_IRBASEHAND,
                DOT11_PHY_TYPE_OFDM,
                DOT11_PHY_TYPE_HRDSSS,
                DOT11_PHY_TYPE_ERP,
                DOT11_PHY_TYPE_HT,
                DOT11_PHY_TYPE_IHV_START,
                DOT11_PHY_TYPE_IHV_END
            }
            public enum DOT11_AUTH_ALGORITHM
            {
                DOT11_AUTH_ALGO_80211_OPEN = 1,
                DOT11_AUTH_ALGO_80211_SHARED_KEY = 2,
                DOT11_AUTH_ALGO_WPA = 3,
                DOT11_AUTH_ALGO_WPA_PSK = 4,
                DOT11_AUTH_ALGO_WPA_NONE = 5,
                DOT11_AUTH_ALOG_RSNA = 6,
                DOT11_AUTH_ALOG_RSNA_PSK = 7,
                DOT11_AUTH_ALOG_IHV_START = -2147483648,
                DOT11_AUTH_ALOG_IHV_END = -1
            }
            public enum DOT11_CIPER_ALGORITHM
            {
                DOT11_CIPER_ALGO_NONE = 0,
                DOT11_CIPER_ALGO_WEP40 = 1,
                DOT11_CIPER_ALGO_TKIP = 2,
                DOT11_CIPER_ALGO_CCMP = 4,
                DOT11_CIPER_ALGO_WEP104 = 5,
                DOT11_CIPER_ALGO_WPA_USE_GROUP = 256,
                DOT11_CIPER_ALGO_RSN_USE_GROUP = 256,
                DOT11_CIPER_ALGO_WEP = 257,
                DOT11_CIPER_ALGO_IHV_START = -2147483648,
                DOT11_CIPER_ALGO_IHV_END = -1
            }
            /// <summary>
            /// 
            /// </summary>
            [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
            public struct WLAN_AVAILABLE_NETWORK
            {
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
                public string strProfileName;
                public DOT11_SSID dot11Ssid;
                public DOT11_BSS_TYPE dot11BssType;
                public uint uNumberOfBssids;
                public bool bNetworkConnectable;
                public uint wlanNotConnectableReason;
                public uint uNumberOfPhyTypes;
                [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
                public DOT11_PHY_TYPE[] dot11PhyTypes;
                public bool bMorePhyTypes;
                public uint wlanSignalQuality;
                public bool bSecurityEnabled;
                public DOT11_AUTH_ALGORITHM dot11DefaultAuthAlgorithm;
                public DOT11_CIPER_ALGORITHM dot11DefaultCipherAlgorithm;
                public uint dwFlags;
                public uint dwReserved;
            }
            /// <summary>
            /// 
            /// </summary>
            [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
            struct WLAN_AVALABLE_NETWORK_LIST
            {
                internal uint dwNumberOfItems;
                internal uint dwIndex;
                internal WLAN_AVAILABLE_NETWORK[] wlanAvailableNetwork;
                internal WLAN_AVALABLE_NETWORK_LIST(IntPtr ppAvailableNetworkList)
                {
                    dwNumberOfItems = (uint)Marshal.ReadInt32(ppAvailableNetworkList);
                    dwIndex = (uint)Marshal.ReadInt32(ppAvailableNetworkList, 4);
                    wlanAvailableNetwork = new WLAN_AVAILABLE_NETWORK[dwNumberOfItems];
                    for (int i = 0; i < dwNumberOfItems; i++)
                    {
                        IntPtr pWlanAvailableNetwork = new IntPtr(ppAvailableNetworkList.ToInt32() + i * Marshal.SizeOf(typeof(WLAN_AVAILABLE_NETWORK)) + 8);
                        wlanAvailableNetwork[i] = (WLAN_AVAILABLE_NETWORK)Marshal.PtrToStructure(pWlanAvailableNetwork, typeof(WLAN_AVAILABLE_NETWORK));
                    }
                }
            }
            public static void EnumerateAvailableNetwork()
            {
                uint serviceVersion = 0;
                IntPtr handle = IntPtr.Zero;
                int result;
                result = (int)WlanOpenHandle(2, IntPtr.Zero, out serviceVersion, ref handle);
                Console.WriteLine(result);
                IntPtr ppInterfaceList = IntPtr.Zero;
                WLAN_INTERFACE_INFO_LIST interfaceList;
                if (WlanEnumInterfaces(handle, IntPtr.Zero, ref ppInterfaceList) == 0)
                {
                    interfaceList = new WLAN_INTERFACE_INFO_LIST(ppInterfaceList);
                    Console.WriteLine("有{0}個無線網絡適配器", interfaceList.dwNumberOfItems);
                    Console.WriteLine("Enumerating Wireless Network Adapters...");
                    for (int i = 0; i < interfaceList.dwNumberOfItems; i++)
                    {
                        Console.WriteLine("{0}", interfaceList.InterfaceInfo[i].strInterfaceDescription);
                        IntPtr ppAvailableNetworkList = new IntPtr();
                        Guid pInterfaceGuid = interfaceList.InterfaceInfo[i].InterfaceGuid;
                        WlanGetAvailableNetworkList(handle, ref pInterfaceGuid, 0x00000002, new IntPtr(), ref ppAvailableNetworkList);
                        WLAN_AVALABLE_NETWORK_LIST wlanAvailableNetworkList = new WLAN_AVALABLE_NETWORK_LIST(ppAvailableNetworkList);
                        WlanFreeMemory(ppAvailableNetworkList);
                        WlanCloseHandle(handle, IntPtr.Zero);
                        for (int j = 0; j < wlanAvailableNetworkList.dwNumberOfItems; j++)
                        {
                            WLAN_AVAILABLE_NETWORK network = wlanAvailableNetworkList.wlanAvailableNetwork[j];
                            Console.ForegroundColor = ConsoleColor.Red;
                            Console.WriteLine("Available Network:");
                            Console.WriteLine("SSID:" + network.dot11Ssid.ucSSID);
                            Console.WriteLine("StrProfile:" + network.strProfileName);
                            Console.WriteLine("Encrypted:" + network.bSecurityEnabled);
                            Console.WriteLine("Signal Strength:" + network.wlanSignalQuality);
                            Console.WriteLine("Default Authentication:" + network.dot11DefaultAuthAlgorithm.ToString());
                            Console.WriteLine("Default Cipher:" + network.dot11DefaultCipherAlgorithm.ToString());
                            Console.WriteLine("InterfaceGuid:" + pInterfaceGuid.ToString("B").ToUpper());
                            Console.WriteLine();
                            Console.ReadKey();

                        }
                    }
                }
                else
                {
                    Console.WriteLine("本機沒有發現有無線網絡適配器");
                }
            }
        }
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章