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("本机没有发现有无线网络适配器");
}
}
}
}