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管理相关推荐

  1. windows下,C++中调用命令行并且获取命令行的输出

    说明,上一次写到了使用共享内存来实现获取命令行的输出.但是共享内存实际上是实现两个进程间的通信.其使用方式为在本进程创建共享内存,并在另外一个进程中调用cmd将结果写入到共享内存中,实际没有处理如何调 ...

  2. linux命令行连接wifi RTL810xE PCI Express Fast Ethernet Controller 网卡

    linux命令行连接wifi - hunters007 - 博客园 https://www.cnblogs.com/hunter-007/p/11151092.html hunters007 linu ...

  3. Windows中的命令行提示符里的Start命令执行路径包含空格时的问题

    转自:http://www.x2009.net/articles/windows-command-line-prompt-start-path-space.html 当使用Windows 中的命令行提 ...

  4. qt执行命令行失败_QT中QProcess调用命令行的痛苦经历

    在QT程序中需要将某些目录和文件压缩为一个rar的压缩包,于是想到了在QT中通过QProcess类调用命令行的rar.exe来达到效果,但是没想到QProcess类用起来很麻烦,而且达不到效果,折腾了 ...

  5. QT中QProcess调用命令行的痛苦经历

    在QT程序中需要将某些目录和文件压缩为一个rar的压缩包,于是想到了在QT中通过QProcess类调用命令行的rar.exe来达到效果,但是没想到QProcess类用起来很麻烦,而且达不到效果,折腾了 ...

  6. windows下 cl: 命令行 error D8021 :无效的数值参数“/Wno-cpp”的解决办法

    Mask R-CNN学习(三):windows下 cl: 命令行 error D8021 :无效的数值参数"/Wno-cpp"的解决办法 2018年07月20日 11:11:06 ...

  7. java调用命令行命令_Java命令行界面(第4部分):命令行

    java调用命令行命令 我的Java命令行解析系列的第四部分介绍了Commandline ,它被描述为 "用于解析命令行参数的Java库",它"基于使用注释从命令行参数到 ...

  8. python调用cmd执行命令_python调用命令行,其中包含“echo”和“|”

    参见英文答案 > piping in shell via Python subprocess module 4个 我试着用python调用命令行执行一些文件.但是,当有一个包含"ech ...

  9. java 调用命令行

    java 调用命令行 JAVA Runtime类 java调用命令行 1. java调用终端,使用命令"javac" 2. java调用终端,使用javac编译helloWorld ...

最新文章

  1. 计算机应用基础10000字论文,计算机应用基础论文
  2. 线段树之延时标记(区间修改)及lazy思想
  3. 移动端H5 腾讯地图sdk 当前位置 地址你解析 距离计算
  4. javascript jquery ajax动态提交多个参数 api测试
  5. if 语句 写了return 报错
  6. GeoTools——新建shapefile文件
  7. paip.图片文件上传功能总结
  8. web前端----------网易云音乐播放器简单的实现(素材自行下载)
  9. 敏捷的三个中心;再谈Buffer
  10. List.toArray
  11. 4G 5G 频段介绍
  12. python中\t \r \s \n \f各种转移字符含义
  13. 《认知天性》读书笔记
  14. php退出数据库命令,签约1年半!33岁中超旧将正式登陆葡超,时隔16年重回葡萄牙踢球...
  15. 基于Android课堂学习系统的文献综述
  16. Node.js 微服务实践:基于容器的一站式命令行工具链
  17. 电脑捕捉android 屏幕,Android屏幕捕捉
  18. 10.3 键盘加速键
  19. 西北工业大学NOJ Python程序设计作业91-100
  20. 电磁波系列文章之电磁波简介

热门文章

  1. 改变图纸中的剪短符号
  2. 浏览器设置中,怎么禁用或启用Cookie
  3. (完美)华为荣耀note8 EDI-AL10的Usb调试模式在哪里开启的步骤
  4. 架构师:每天要在鱼和熊掌之间做选择
  5. 学计算机专业表情包,各社会专业人表情包,广告人的表情包弱爆了
  6. PHP关于redis面试题
  7. 新路由3 D2版本解锁刷入brend
  8. 买什么样的充电宝安全?安全性高的充电宝推荐
  9. 怎么把动图放到word里_怎么把动图插入word
  10. 支付宝收款软件常见问题处理