根据前面的一个内容对功能和合理性上做了扩充和优化。
代码如下:
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; } }
}
}
调用端代码如下:
VWirelessNetworkManager vwifi;
vwifi = new VWirelessNetworkManager(); vwifi.VWirelessSetted += Vwifi_VWirelessSetted; vwifi.VWirelessStarted += Vwifi_VWirelessStarted; vwifi.VWirelessStopped += Vwifi_VWirelessStopped; vwifi.VWirelessChecking += Vwifi_VWirelessChecking;
比较重要的是下面这个是下面这个事件的返回值,他决定了是否一直循环检查虚拟无线网络的是否正常。
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;
}