windows server 2012 网卡虚拟化
最近因为公司的业务要求,在没有网络的情况下,没有路由器支持的情况下,需要组建一个小局域网,可以同时支持多个终端的相互之间的通信,这里的解决方案如下。
一、硬件要求:任意支持软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; } }
四、测试代码如下:
五、说明
最后测试部分的动态密码的意思是提供不公开密码的情况下,根据规则自动计算的,具体方法可以自己修改。
Windows Server 2012如何实现双网卡绑定windows server 2008双网卡绑定
Windows server 2012 双网卡的配置windows server 2012双网卡绑定
Windows Server 2012 R2 双网卡绑定windows server 2012 r2 网卡驱动
windows server 2012R2 双网卡绑定windows server 2012 r2 无线网卡
Windows Server 2012 R2配置双网卡绑定windows server 2012 r2 网卡驱动
windows server2012查虚拟化是否开启 windows server 2012虚拟化
windows server 2016 虚拟化 windows server 2012虚拟化
windows server 2022 虚拟化 windows server 2012虚拟化