当前位置: 首页 > backend >正文

Windows 10 操作系统下利用USB无限网卡创建虚拟WirelessNetwork 类的封装

最近因为公司的业务要求,在没有网络的情况下,没有路由器支持的情况下,需要组建一个小局域网,可以同时支持多个终端的相互之间的通信,这里的解决方案如下。


一、硬件要求:任意支持软AP的无限网卡,具体是否支持请输入命令行如下查看,如图(一):


图(一)

根据上图,包含 C:\Windows\system32\DRIVERS\vwifibus.sys即可支持软AP。

二、熟悉命令

1.设置并允许虚拟无线网路;

命令:netsh 命令符下输入 wlan set hostednetwork mode = allow ssid=无线名称 key=无线密码(8位数)

返回结果:承载网络模式已设置为允许。
已成功更改承载网络的 SSID。
已成功更改托管网络的用户密钥密码。


2.显示设置的虚拟网络信息;

命令:netsh 命令符下输入 wlan show hostednetwork

返回结果:承载网络设置
-----------------------
    模式                   : 已启用
    SSID 名称              :“无线名称”
    最多客户端数  : 32
    身份验证         : WPA2 - 个人
    密码                 : CCMP


承载网络状态
---------------------
    状态                 : 未启动


netsh>


3.启动设置的无线网络

命令:netsh 命令符下输入 wlan start hostednetwork


4.停止设置的无线网络

命令:netsh 命令符下输入 wlan stop hostednetwork


5.禁止设置的无线网络

命令:命令:netsh 命令符下输入 wlan set hostednetwork mode=disallow

返回结果:承载网络模式已设置为禁止。


三、对应封装的C#类,代码如下:

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;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"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 SetVWirelessInfo(string sSID){string encryptPlus;string key = GetDynamicVWirelessKey(sSID, out encryptPlus);SetVWirelessInfo(sSID, key, true);}public void SetVWirelessInfo(string sSID, string key){SetVWirelessInfo(sSID, key, false);}public void SetVWirelessInfo(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 StartVWirelessNet(){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 = GetIpAddress();OnVWirelessStarted(e);}public void StopVWirelessNet(){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 DisallowVWirelessNet(){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();}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;}public string GetIpAddress(){string ipV4Address = null;//获取虚拟无限网络的IPV4地址NetworkInterface vNetwork = NetworkInterface.GetAllNetworkInterfaces().FirstOrDefault(w => w.Description == "Microsoft Hosted Network Virtual Adapter" && w.NetworkInterfaceType == NetworkInterfaceType.Wireless80211);UnicastIPAddressInformationCollection ipCollection = vNetwork.GetIPProperties().UnicastAddresses;if (ipCollection.Count > 1){ipV4Address = ipCollection[1].Address.ToString();}else{ipV4Address = ipCollection[0].Address.ToString();}return ipV4Address;}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 OnVWirelessSetted(VWirelessNetworkEventArgs e){if (VWirelessSetted != null){VWirelessSetted(this, e);}}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;}}

 /// <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 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 = null;vwifi = new VWirelessNetworkManager();vwifi.VWirelessSetted += Vwifi_VWirelessSetted;vwifi.VWirelessStarted += Vwifi_VWirelessStarted;vwifi.VWirelessStopped += Vwifi_VWirelessStopped;/// <summary>/// 窗口加载事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void FrmShowNetInfo_Load(object sender, EventArgs e){//this.lstboxMessage.Items.Add("消息:正在启动应用程序!");RunatVWirelessNetwork();}private void RunatVWirelessNetwork(){// this.lstboxMessage.Items.Add("消息:正在检测是否安装USB版本的无限网卡!");if (CheckWirelessCard()){// this.lstboxMessage.Items.Add("消息:检测已经安装USB版本的无限网卡!");if (GlobalConfig.AppSettings.VWirelessNetwork.IsEnableDynamicKey){//this.lstboxMessage.Items.Add("消息:动态生成密码功能已开启,以规则运算方式并创建虚拟无限网络!");vwifi.SetVWirelessInfo(string.Format("SmTR-{0}", DateTime.Now.ToString("HHmmssfffffff")));}else{//this.lstboxMessage.Items.Add("消息:动态生成密码功能未开启,以明文密码方式并创建虚拟无限网络!");vwifi.SetVWirelessInfo(string.Format("SmTR-{0}", DateTime.Now.ToString("HHmmssfffffff")), DateTime.Now.ToOADate().ToString());}//this.lstboxMessage.Items.Add("消息:正在启动虚拟无限网络!");vwifi.StartVWirelessNet();}else{Application.Exit();}

五、说明

最后测试部分的动态密码的意思是提供不公开密码的情况下,根据规则自动计算的,具体方法可以自己修改。

如有其他问题可以留言。




http://www.xdnf.cn/news/11307.html

相关文章:

  • 集群技术(百科)
  • 绿色软件是怎么制作的?(转)
  • 学习vue源码(10)手写render渲染函数,在线前端开发学习
  • asp-Webshell免杀
  • Application Layer Gateway Service
  • 最新全国三级城市地区及经纬度数据下载
  • 不用微博SDK,直接使用 新浪微博 分享链接进行分享
  • tomcat7下载
  • Android 文件下载
  • 基于MapGuide的在线WebGIS站点介绍
  • route add命令详解
  • 【经典收藏】深度技术ghost官方原版XP系统sp3下载地址 ...
  • 常用网页广告代码全集-js广告代码大全-个人收藏
  • Java语言 static (静态变量、实例变量、局部变量、静态方法)
  • 数据结构课程设计
  • WinPE安装与卸载(微PE版)
  • Matlab中plot画图线型、标记和颜色
  • 黑客完全修炼手册(收藏)
  • Python学习之海龟绘图
  • 计算机丢失UxTheme无法修复,win10系统丢失uxtheme.dll的修复办法
  • 托管代码
  • slot插槽以及具名插槽
  • nagios 安装
  • 使用深度学习检测混凝土结构中的表面裂缝
  • mapinfo10.5破解版安装
  • CSS滤镜(Filter)全攻略
  • ROS官方教程[翻译]---message_filter的使用
  • VC++类型转换整理(转载)
  • Edius简易教程
  • 编译原理课程设计(编写编译器)