Windows C#调用命令行实现WIFI管理
C#调用命令行实现WIFI管理【输入密码、连接,获取本地WIFI配置】
- 1.可见网络扫描
- 2.获取本地已保存WIFI配置信息
- 3.导出本地WIFI配置信息
- 4.导入WiFi自定以配置信息,并输入密码
- 附件WinCmdHelper
最近有个需求,需要通过在软件客户端里实现对WIFI管理。所以就查了相关资料搞了这个工具类,希望可以帮助到大家。这个只是个简单的工具类,所以有很大的优化空间。废话不多说,进入正文········
首先我们来看看从命令行里能拿到数据:使用netsh wlan
命令
当我们在操作设置WIFI网络连接的时候都会在系统中生成相应的配置文件。上面这些命令就是对配置文件的各种操作。我们首先看show
这个命令
1.可见网络扫描
先看看show networks
这个命令,这个可以获取当前你的网卡扫描到的WiFi信号。
我们可以通过调用进程启动命令行,获取输出数据。遍历每行,因为每个WIFI名称前都是SSID:数字,于是就可以使用正则表达式,^SSID[*0-9]:[^\\\/\^]+
匹配满足表达式的字符串,过滤出wifi名称加入集合。
public static List<string> GetWIFIInfos(){List<string> wifis = null;Regex regex = new Regex(@"^SSID[*0-9]:[^\\\/\^]+", RegexOptions.IgnorePatternWhitespace|RegexOptions.Singleline);if(Helpers.WinCmdHelper.ExcuteDosCommand("netsh wlan show networks mode=BSSID\r\n", false, true,out string res)){wifis = new List<string>();string[] lines = res.Split("\r\n");foreach (var item in lines){var _item = item.Replace(" ","");bool match = regex.IsMatch(_item);if (match){wifis.Add(_item.Split(':')?[1]);}}}return wifis;}
来看看运行效果吧。正则不是很熟悉,可能写的有问题,每次过滤的都会有些偏差,希望大神能指导一下。不过思路应该是没问题的。
2.获取本地已保存WIFI配置信息
这个功能需要调用命令行netsh wlan show profiles
来看看执行结果
我本地连过的所有的Wifi配置文件都在这里了。当然也准备好了解析函数。
public static List<string> GetUserProfiles(){List<string> prof = null;Regex regex = new Regex(@"[\u4e00-\u9fa5]+:[^\\\/\^]+", RegexOptions.IgnorePatternWhitespace | RegexOptions.Singleline);if (Helpers.WinCmdHelper.ExcuteDosCommand("netsh wlan show profiles",false,true,out string res)){prof = new List<string>();string[] lines = res.Split("\r\n");foreach (var item in lines){string _item = item.Replace(" ", ""); ;if (regex.IsMatch(_item)){prof.Add(_item.Split(":")?[1]);}}}return prof;}
这个函数,主要是为判断后面是否需要输入密码连接做判断。来看看该函数运行结果:
3.导出本地WIFI配置信息
这个功能需要调用命令行netsh wlan export······
来导出所有文件或者指定wifi配置。来看看执行结果
因为我是调用管理员权限的命令行,所以文件保存目录C:\Windows\System32
现在看看文件xml配置文件结构,我们以WLAN-Mask.xml
为例
这个目录看起来很清晰吧,不需要再赘述了吧。
4.导入WiFi自定以配置信息,并输入密码
我们现在开始解决输入密码的问题。我们可以复制一份这个文件WiFi配置xml文件至软件目录下,【注意:protected节点要改成false】。作为Wifi配置信息模板。随便起什么名字都可以。
第一步:导入配置信息
命令:netsh wlan add profile fileName={profileName}"
函数如下:
public static bool ImportWIFIProfile(string profileName){var profs = GetUserProfiles();if (!profs.Contains(Path.GetFileNameWithoutExtension(profileName))){return Helpers.WinCmdHelper.ExcuteDosCommand($"netsh wlan add profile fileName={profileName}", false, true, out string res);}return true;}
第二步:修改配置信息,设置SSID和密码
命令:etsh wlan set profileparameter name = {name} SSIDname={ssid} keyMaterial = {pwd}"
参数说明:
【name】:配置文件名称,就是软件目录下那个xml文件名称。
【ssid】:wifi将要连接的WiFi名称
【pwd】:将要连接WiFi的密码
public static bool SetProfile(,string name,string pwd,string ssid){return Helpers.WinCmdHelper.ExcuteDosCommand($"netsh wlan set profileparameter name = {name} SSIDname={ssid} keyMaterial = {pwd}", false, true, out string res);}
命令执行结果,WIFI配置文件修改结束。
第三步:连接WiFi
命令:netsh wlan connect name = {name} ssid = {ssid}"
参数说明:
【name】:配置文件名称
【ssid】:wifi将要连接的WiFi名称
当然这个也有封装好的函数:
public static bool Connect(string ssid){return Helpers.WinCmdHelper.ExcuteDosCommand($"netsh wlan connect name = MNR ssid = {ssid}", false, true, out string res);}
OK大功告成,希望可以帮助大家。这个只是个Demo,我只是做了简单的测试,还有很多不足,欢迎大家沟通交流。
附件WinCmdHelper
附上网上小伙伴贡献的工具类,因为作者忘记是谁了,所以在这里先感谢。
public class WinCmdHelper{#region 执行Dos命令/// <summary>/// 执行Dos命令/// </summary>/// <param name="cmd">Dos命令及参数</param>/// <param name="isShowCmdWindow">是否显示cmd窗口</param>/// <param name="isCloseCmdProcess">执行完毕后是否关闭cmd进程</param>/// <returns>成功返回true,失败返回false</returns>public static bool ExcuteDosCommand(string cmd, bool isShowCmdWindow, bool isCloseCmdProcess,out string outlines){string res = string.Empty;try{Process p = new Process();p.StartInfo.FileName = "cmd";p.StartInfo.UseShellExecute = false;p.StartInfo.RedirectStandardInput = true;p.StartInfo.RedirectStandardOutput = true;p.StartInfo.CreateNoWindow = !isShowCmdWindow;p.OutputDataReceived += new DataReceivedEventHandler(delegate (object sender, DataReceivedEventArgs e) {if (!String.IsNullOrEmpty(e.Data)){res += e.Data+"\r\n";}});p.Start();StreamWriter cmdWriter = p.StandardInput;p.BeginOutputReadLine();if (!String.IsNullOrEmpty(cmd)){cmdWriter.WriteLine(cmd);}cmdWriter.Close();p.WaitForExit();if (isCloseCmdProcess){p.Close();}LogHelper.Logger.Write(Serilog.Events.LogEventLevel.Information,String.Format("成功执行Dos命令[{0}]!", cmd));outlines = res;return true;}catch (Exception ex){LogHelper.Logger.Write(Serilog.Events.LogEventLevel.Information,"执行命令失败,请检查输入的命令是否正确:" + ex.Message, ex);outlines = res;return false;}}#endregion#region 判断指定的进程是否在运行中/// <summary>/// 判断指定的进程是否在运行中/// </summary>/// <param name="processName">要判断的进程名称,不包括扩展名exe</param>/// <param name="processFileName">进程文件的完整路径</param>/// <returns>存在返回true,否则返回false</returns>public static bool CheckProcessExists(string processName, string processFileName){Process[] processes = Process.GetProcessesByName(processName);foreach (Process p in processes){if (!String.IsNullOrEmpty(processFileName)){if (processFileName == p.MainModule.FileName){return true;}}else{return true;}}return false;}#endregion#region 结束指定的windows进程/// <summary>/// 结束指定的windows进程,如果进程存在/// </summary>/// <param name="processName">进程名称,不包含扩展名</param>/// <param name="processFileName">进程文件完整路径,如果为空则删除所有进程名为processName参数值的进程</param>public static bool KillProcessExists(string processName, string processFileName){try{Process[] processes = Process.GetProcessesByName(processName);foreach (Process p in processes){if (!String.IsNullOrEmpty(processFileName)){if (processFileName == p.MainModule.FileName){p.Kill();p.Close();}}else{p.Kill();p.Close();}}LogHelper.Logger.Write(Serilog.Events.LogEventLevel.Information,String.Format("成功结束[{0}]进程!", processes));return true;}catch (Exception ex){LogHelper.Logger.Write(Serilog.Events.LogEventLevel.Information,"结束指定的Widnows进程异常:" + ex.Message, ex);return false;}}#endregion}
Windows C#调用命令行实现WIFI管理相关推荐
- windows下,C++中调用命令行并且获取命令行的输出
说明,上一次写到了使用共享内存来实现获取命令行的输出.但是共享内存实际上是实现两个进程间的通信.其使用方式为在本进程创建共享内存,并在另外一个进程中调用cmd将结果写入到共享内存中,实际没有处理如何调 ...
- linux命令行连接wifi RTL810xE PCI Express Fast Ethernet Controller 网卡
linux命令行连接wifi - hunters007 - 博客园 https://www.cnblogs.com/hunter-007/p/11151092.html hunters007 linu ...
- Windows中的命令行提示符里的Start命令执行路径包含空格时的问题
转自:http://www.x2009.net/articles/windows-command-line-prompt-start-path-space.html 当使用Windows 中的命令行提 ...
- qt执行命令行失败_QT中QProcess调用命令行的痛苦经历
在QT程序中需要将某些目录和文件压缩为一个rar的压缩包,于是想到了在QT中通过QProcess类调用命令行的rar.exe来达到效果,但是没想到QProcess类用起来很麻烦,而且达不到效果,折腾了 ...
- QT中QProcess调用命令行的痛苦经历
在QT程序中需要将某些目录和文件压缩为一个rar的压缩包,于是想到了在QT中通过QProcess类调用命令行的rar.exe来达到效果,但是没想到QProcess类用起来很麻烦,而且达不到效果,折腾了 ...
- windows下 cl: 命令行 error D8021 :无效的数值参数“/Wno-cpp”的解决办法
Mask R-CNN学习(三):windows下 cl: 命令行 error D8021 :无效的数值参数"/Wno-cpp"的解决办法 2018年07月20日 11:11:06 ...
- java调用命令行命令_Java命令行界面(第4部分):命令行
java调用命令行命令 我的Java命令行解析系列的第四部分介绍了Commandline ,它被描述为 "用于解析命令行参数的Java库",它"基于使用注释从命令行参数到 ...
- python调用cmd执行命令_python调用命令行,其中包含“echo”和“|”
参见英文答案 > piping in shell via Python subprocess module 4个 我试着用python调用命令行执行一些文件.但是,当有一个包含"ech ...
- java 调用命令行
java 调用命令行 JAVA Runtime类 java调用命令行 1. java调用终端,使用命令"javac" 2. java调用终端,使用javac编译helloWorld ...
最新文章
- 计算机应用基础10000字论文,计算机应用基础论文
- 线段树之延时标记(区间修改)及lazy思想
- 移动端H5 腾讯地图sdk 当前位置 地址你解析 距离计算
- javascript jquery ajax动态提交多个参数 api测试
- if 语句 写了return 报错
- GeoTools——新建shapefile文件
- paip.图片文件上传功能总结
- web前端----------网易云音乐播放器简单的实现(素材自行下载)
- 敏捷的三个中心;再谈Buffer
- List.toArray
- 4G 5G 频段介绍
- python中\t \r \s \n \f各种转移字符含义
- 《认知天性》读书笔记
- php退出数据库命令,签约1年半!33岁中超旧将正式登陆葡超,时隔16年重回葡萄牙踢球...
- 基于Android课堂学习系统的文献综述
- Node.js 微服务实践:基于容器的一站式命令行工具链
- 电脑捕捉android 屏幕,Android屏幕捕捉
- 10.3 键盘加速键
- 西北工业大学NOJ Python程序设计作业91-100
- 电磁波系列文章之电磁波简介