根据前面的一个内容对功能和合理性上做了扩充和优化。
代码如下:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Net.NetworkInformation;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;namespace K12NewSmartLesson.PlatForm
{public class VWirelessNetworkManager{private bool isEnableDynamicKey = false;private string cleartextKey = null;public event EventHandler<VWirelessNetworkEventArgs> VWirelessStarted;public event EventHandler<VWirelessNetworkEventArgs> VWirelessStopped;public event EventHandler<VWirelessNetworkEventArgs> VWirelessSetted;public event EventHandler<VWirelessNetworkEventArgs> VWirelessDisallowed;public event EventHandler<VWirelessNetworkEventArgs> VWirelessAllowed;public delegate bool VWirelessNetworkCheckHandler(object sender, VWirelessNetworkCheckEventArgs e);public event VWirelessNetworkCheckHandler VWirelessChecking;private static readonly Process currentProcess = null;private static Process CurrentProcess { get; }private static bool isRunNetsh = true;private static bool isExitNetsh = false;/// <summary>/// 虚拟无线网络信息/// </summary>public VWirelessNetwork VWirelessNetworkInfo{get { return this.GetVWirelessNetwork(); }}static VWirelessNetworkManager(){currentProcess = new Process();currentProcess.StartInfo = new ProcessStartInfo(){RedirectStandardInput = true,RedirectStandardOutput = true,RedirectStandardError = true,UseShellExecute = false,CreateNoWindow = true,FileName = "netsh"};currentProcess.Start();}private bool RunNetsh(){if (!isRunNetsh){isRunNetsh = true;isExitNetsh = false;currentProcess.Start();}return isRunNetsh;}private bool ExitNetsh(){if (!isExitNetsh){currentProcess.StandardInput.WriteLine("exit");isRunNetsh = false;isExitNetsh = true;}return isExitNetsh;}public void SetVWirelessNetworkInfo(string sSID){string encryptPlus;string key = GetDynamicVWirelessKey(sSID, out encryptPlus);SetVWirelessNetworkInfo(sSID, key, true);}public void SetVWirelessNetworkInfo(string sSID, string key){SetVWirelessNetworkInfo(sSID, key, false);}public void SetVWirelessNetworkInfo(string sSID, string key, bool isEnableDynamicKey){this.cleartextKey = key;this.isEnableDynamicKey = isEnableDynamicKey;RunNetsh();currentProcess.StandardInput.AutoFlush = true;currentProcess.StandardInput.WriteLine(string.Format("wlan set hostednetwork mode=allow ssid={0} key={1}", sSID, key));ExitNetsh();VWirelessNetworkEventArgs e = new PlatForm.VWirelessNetworkEventArgs();e.CommandExecutedResult = currentProcess.StandardOutput.ReadToEnd();e.VWirelessNetworkShowInfo = GetVWirelessNetwork();OnVWirelessSetted(e);}public void StartVWirelessNetwork(){RunNetsh();currentProcess.StandardInput.AutoFlush = true;currentProcess.StandardInput.WriteLine("wlan start hostednetwork");ExitNetsh();VWirelessNetworkEventArgs e = new PlatForm.VWirelessNetworkEventArgs();e.CommandExecutedResult = currentProcess.StandardOutput.ReadToEnd();e.VWirelessNetworkShowInfo = GetVWirelessNetwork();e.IPAddress = GetIPV4Address();OnVWirelessStarted(e);}public void StopVWirelessNetwork(){RunNetsh();currentProcess.StandardInput.AutoFlush = true;currentProcess.StandardInput.WriteLine("wlan stop hostednetwork");ExitNetsh();VWirelessNetworkEventArgs e = new PlatForm.VWirelessNetworkEventArgs();e.CommandExecutedResult = currentProcess.StandardOutput.ReadToEnd();e.VWirelessNetworkShowInfo = GetVWirelessNetwork();OnVWirelessStopped(e);}public void DisallowVWirelessNetwork(){RunNetsh();currentProcess.StandardInput.AutoFlush = true;currentProcess.StandardInput.WriteLine("wlan set hostednetwork mode=disallow");ExitNetsh();VWirelessNetworkEventArgs e = new PlatForm.VWirelessNetworkEventArgs();e.CommandExecutedResult = currentProcess.StandardOutput.ReadToEnd();e.VWirelessNetworkShowInfo = GetVWirelessNetwork();this.OnVWirelessDisallowed(e);}public void AllowVWirelessNetwork(){RunNetsh();currentProcess.StandardInput.AutoFlush = true;currentProcess.StandardInput.WriteLine("wlan set hostednetwork mode=allow");ExitNetsh();VWirelessNetworkEventArgs e = new PlatForm.VWirelessNetworkEventArgs();e.CommandExecutedResult = currentProcess.StandardOutput.ReadToEnd();e.VWirelessNetworkShowInfo = GetVWirelessNetwork();this.OnVWirelessAllowed(e);}public bool CheckVWirelessNetwork(){bool isCheckSuccess = false;while (true){VWirelessNetworkCheckEventArgs e = new VWirelessNetworkCheckEventArgs(new List<string>());e.VWirelessNetworkShowInfo = GetVWirelessNetwork();if (e.VWirelessNetworkShowInfo.BearerNetworkSettings.Mode == "已禁用"){e.ErrorTexts.Add("虚拟无线网络被禁用,请使用 this.AllowVWirelessNetwork(); 设置为允许。");}NetworkInterface vNetwork = this.GetMicrosoftHostedNetworkVirtualAdapter();if (vNetwork == null){e.ErrorTexts.Add("未能检测到本地计算机安装USB无线网卡");}if (e.ErrorTexts.Count == 0){e.IPAddress = GetIPV4Address();isCheckSuccess = true;}if (!OnVWirelessChecking(e)){break;}}return isCheckSuccess;}public string GetIPV4Address(){string iPV4Address = null;//获取虚拟无限网络的IPV4地址NetworkInterface vNetwork = GetMicrosoftHostedNetworkVirtualAdapter();UnicastIPAddressInformationCollection ipCollection = vNetwork.GetIPProperties().UnicastAddresses;if (ipCollection.Count > 1){iPV4Address = ipCollection[1].Address.ToString();}else{iPV4Address = ipCollection[0].Address.ToString();}return iPV4Address;}public string GetIPV6Address(){string iPV6Address = null;//获取虚拟无限网络的IPV4地址NetworkInterface vNetwork = GetMicrosoftHostedNetworkVirtualAdapter();UnicastIPAddressInformationCollection ipCollection = vNetwork.GetIPProperties().UnicastAddresses;if (ipCollection.Count > 1){iPV6Address = ipCollection[0].Address.ToString();}return iPV6Address;}public NetworkInterface GetMicrosoftHostedNetworkVirtualAdapter(){return NetworkInterface.GetAllNetworkInterfaces().FirstOrDefault(w => w.Description == "Microsoft Hosted Network Virtual Adapter" && w.NetworkInterfaceType == NetworkInterfaceType.Wireless80211);}protected virtual VWirelessNetwork GetVWirelessNetwork(){RunNetsh();currentProcess.StandardInput.AutoFlush = true;currentProcess.StandardInput.WriteLine("wlan show hostednetwork");ExitNetsh();VWirelessNetwork vWNInfo = new VWirelessNetwork();vWNInfo.IsEnableDynamicKey = isEnableDynamicKey;vWNInfo.RawVWirelessNetworkShowInfo = currentProcess.StandardOutput.ReadToEnd();string[] kvpItems = vWNInfo.RawVWirelessNetworkShowInfo.Split(new char[] { '\r', '\n' });if (kvpItems.Length > 14){vWNInfo.BearerNetworkSettings = new PlatForm.BearerNetworkSettings(){Mode = kvpItems[6].Split(':')[1].Trim(),SSID = kvpItems[8].Split(':')[1].Trim().Trim(new char[] { '“', '”' }),MaxClientQuantity = int.Parse(kvpItems[10].Split(':')[1]),Authentication = kvpItems[12].Split(':')[1].Trim(),Key = this.isEnableDynamicKey ? kvpItems[14].Split(':')[1].Trim() : this.cleartextKey};vWNInfo.BearerNetworkStatus = new BearerNetworkStatus();string status = kvpItems[22].Split(':')[1].Trim();vWNInfo.BearerNetworkStatus.Status = status;if (status == "已启动"){vWNInfo.BearerNetworkStatus.BSSID = kvpItems[24].Substring(28, 17);vWNInfo.BearerNetworkStatus.WirelessType = kvpItems[26].Split(':')[1].Trim();vWNInfo.BearerNetworkStatus.Channels = int.Parse(kvpItems[28].Split(':')[1]);int clientQuantity = int.Parse(kvpItems[30].Split(':')[1]);vWNInfo.BearerNetworkStatus.ClientQuantity = clientQuantity;if (clientQuantity > 0){for (int i = 1; i <= clientQuantity; i++){vWNInfo.BearerNetworkStatus.Clients.Add(kvpItems[30 + i * 2].TrimStart().Substring(0, 17));}}}}return vWNInfo;}protected virtual void OnVWirelessSetted(VWirelessNetworkEventArgs e){if (VWirelessSetted != null){VWirelessSetted(this, e);}}protected virtual void OnVWirelessStarted(VWirelessNetworkEventArgs e){if (VWirelessStarted != null){VWirelessStarted(this, e);}}protected virtual void OnVWirelessStopped(VWirelessNetworkEventArgs e){if (VWirelessStopped != null){VWirelessStopped(this, e);}}protected virtual void OnVWirelessDisallowed(VWirelessNetworkEventArgs e){if (VWirelessDisallowed != null){VWirelessDisallowed(this, e);}}protected virtual void OnVWirelessAllowed(VWirelessNetworkEventArgs e){if (VWirelessAllowed != null){VWirelessAllowed(this, e);}}protected virtual bool OnVWirelessChecking(VWirelessNetworkCheckEventArgs e){bool isContinueLoopChecking = true;if (VWirelessChecking != null){isContinueLoopChecking = VWirelessChecking(this, e);}return isContinueLoopChecking;}private static string GetDynamicVWirelessKey(string sSID, out string encryptPlus){string encrypedSSID = GetHashedString32(sSID); ;string head = null;string tail = null;encryptPlus = Guid.NewGuid().ToString();char[] chars = encryptPlus.ToCharArray();for (int i = 0; i < chars.Length; i++){if (i % 2 == 0){head += chars[i];}else{tail += chars[i];}}string waitingEncryptString2 = head + encrypedSSID + tail;return GetHashedString32(waitingEncryptString2);}private static string GetHashedString32(string waitingEncryptString){string encrypedString = null;byte[] buff = Encoding.UTF8.GetBytes(waitingEncryptString);MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();byte[] encryptedBuff = md5.ComputeHash(buff);foreach (byte b in encryptedBuff){encrypedString += b.ToString("X2");}return encrypedString;}}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace K12NewSmartLesson.PlatForm
{/// <summary>/// 虚拟无线网络事件参数/// </summary>public class VWirelessNetworkEventArgs : EventArgs{/// <summary>/// 命令执行后的结果/// </summary>public string CommandExecutedResult { get; set; }/// <summary>/// 虚拟无限网络的IP地址/// </summary>public string IPAddress { get; set; }/// <summary>/// 显示虚拟无线网络信息/// </summary>public VWirelessNetwork VWirelessNetworkShowInfo { get; set; }}/// <summary>/// 验证虚拟无线网络是否可用事件参数/// </summary>public class VWirelessNetworkCheckEventArgs : VWirelessNetworkEventArgs{/// <summary>/// 出错文本信息列表字段/// </summary>private IList<string> errorTexts;/// <summary>/// 初始化验证虚拟无线网络是否可用事件参数的实例/// </summary>/// <param name="errorTexts">出错文本信息列表</param>public VWirelessNetworkCheckEventArgs(IList<string> errorTexts){this.errorTexts = errorTexts;}/// <summary>/// 出错文本信息列表/// </summary>public IList<string> ErrorTexts{get{return errorTexts;}}}/// <summary>/// 虚拟无线网络信息/// </summary>public class VWirelessNetwork{/// <summary>/// 显示虚拟无线网络原始信息/// </summary>public string RawVWirelessNetworkShowInfo { get; set; }/// <summary>/// 是否启用虚拟无限网络动态生成密码/// </summary>public bool IsEnableDynamicKey { get; set; }/// <summary>/// 承载虚拟无线网络设置/// </summary>public BearerNetworkSettings BearerNetworkSettings { get; set; }/// <summary>/// 承载虚拟无线网络状态/// </summary>public BearerNetworkStatus BearerNetworkStatus { get; set; }}/// <summary>/// 承载网络设置/// </summary>public class BearerNetworkSettings{/// <summary>/// 模式/// </summary>public string Mode { get; set; }/// <summary>/// SSID 名称/// </summary>public string SSID { get; set; }/// <summary>/// 最多客户端数/// </summary>public int MaxClientQuantity { get; set; }/// <summary>/// 身份验证/// </summary>public string Authentication { get; set; }/// <summary>/// 密码/// </summary>public string Key { get; set; }}/// <summary>/// 承载网络状态/// </summary>public class BearerNetworkStatus{private IList<string> clients = new List<string>();/// <summary>/// 状态/// </summary>public string Status { get; set; }/// <summary>/// BSSID/// </summary>public string BSSID { get; set; }/// <summary>/// 无线电类型/// </summary>public string WirelessType { get; set; }/// <summary>/// 频道/// </summary>public int Channels { get; set; }/// <summary>/// 客户端数/// </summary>public int ClientQuantity { get; set; }/// <summary>/// 客户端MAC地址列表/// </summary>public IList<string> Clients { get { return clients; } }}
}
调用端代码如下:
vwifi = new VWirelessNetworkManager(); vwifi.VWirelessSetted += Vwifi_VWirelessSetted; vwifi.VWirelessStarted += Vwifi_VWirelessStarted; vwifi.VWirelessStopped += Vwifi_VWirelessStopped; vwifi.VWirelessChecking += Vwifi_VWirelessChecking;VWirelessNetworkManager vwifi;
比较重要的是下面这个是下面这个事件的返回值,他决定了是否一直循环检查虚拟无线网络的是否正常。
private bool Vwifi_VWirelessChecking(object sender, VWirelessNetworkCheckEventArgs e) { bool isContinueChecking = false; if (e.ErrorTexts.Count > 0) { string topErrorText = string.Format("{0},重试请按确定,退出请按取消,谢谢!", e.ErrorTexts[0]); if (MessageBox.Show(topErrorText, "错误", MessageBoxButtons.OKCancel, MessageBoxIcon.Error) == DialogResult.Cancel) { Application.Exit(); } isContinueChecking = true; } return isContinueChecking; }