zoukankan      html  css  js  c++  java
  • 通过程序启用/禁用 网络连接(提供4种思路 你值得拥有)

    一。场景回顾:

    写这篇文章的主要原因是这些天,因为客户那边的需求,而更改的一个需求。在这过程中,翻阅了很多的资料,发现了几种方法,所以把一些我知道的方法贴出来,以飨读者。希望你们喜欢。

    二。解决方案

    2.1 通过命令行方式----netsh

    说到这个,顺便给一个查看所以网络连接的命令:

    netsh int show int -----注:int 也就是interface的意思,可以写全字或者缩写,都ok。

    你看,上面罗列了所有我本地的网络连接。好的,其实我们在程序中 也是用这个语法,只是我们需要加一个set关键字。语法是:

    netsh int set int name=“网络连接名” admin=disable/enable  connect=disconnected/connected newname=新的名字

    对上面的语法,我们只需要关注name和admin就可以了,后面的2个不能用在非lan中。前2个很好理解,name,就是你网络连接的名字,比如Local Area Conenction;admin 指的是你要关闭或者重启你的网络连接。那在程序中怎么实现呢?

    代码如下

              string args = "int set int name=‘本地网络连接’ admin=disable";
                    ProcessStartInfo start = new ProcessStartInfo("netsh", args);
                    start.UseShellExecute = false;
                    start.CreateNoWindow = true;
                    start.Verb = "runas";
                    Process p = System.Diagnostics.Process.Start(start);

    这样,就把本地网络连接这个给disable。

    注:对name属性而言,如果有空格一定要用引号,如果没有空格则可不用。比如这里你也可以 name=本地网络连接。同理,后面的admin也可有可无引号。

    顺便提一下,如果你想获取输出的一些数据,ok 你可以这样做,比如我想获取所有的网络连接。

    List<string> lists = new List<string>();
                string args = "int show interface";
                ProcessStartInfo start = new ProcessStartInfo("netsh", args);
                start.UseShellExecute = false;
                start.CreateNoWindow = true;
                start.Verb = "runas";
                start.RedirectStandardOutput = true;
                Process p = Process.Start(start);
    
                StreamReader reader = p.StandardOutput;
    
                while (!reader.EndOfStream)
                {
                    lists.Add(reader.ReadLine());
                }
                return lists;

    其中,start.RedirectStandardOutput = trueStreamReader reader = p.StandardOutput是关键的地方。

    优点:很方便使用,容易上手。

    缺点:只能在win 2000、2003、2008以及win 7中使用。

    2.2 使用WMI----Win32_NetworkAdapter

    对,我们这里使用微软大名鼎鼎的WMI,里面主要有Win32_NetworkAdapter MSFT_NetAdapter 前面一个已经被微软设为不建议使用了。但,我现在还是用的第一个。

    至于WMI 的写法,我这边不写,这个就几个固定格式,很容易看懂,如果不懂的话,可以去度娘看看。

    禁止一个Wifi

     public static bool disableWireless()
            {string manage = "SELECT * From Win32_NetworkAdapterConfiguration where IPEnabled=true";//意思是说,如果当前的有IP,那么就是可以使用的网络地址。
                ManagementObjectSearcher searcher = new ManagementObjectSearcher(manage);
                ManagementObjectCollection collection = searcher.Get();
                List<string> netWorkList = new List<string>();
                foreach (ManagementObject obj in collection)
                {
                    if (obj["Description"].ToString().ToUpper().Contains("Wireless Network Connection"))
                    {
                        obj.InvokeMethod("disable", null);//这边有一个调用disable 这个方法就好了。disable方法不需要我们自己写,可以认为是一个委托吧。
                    }
                }
                return true;
            }

    当然,很简单,开启也很容易:

     public static bool enableWireless()
            {
                string manage = "SELECT * From Win32_NetworkAdapter Where NetEnabled = false";
                ManagementObjectSearcher searcher = new ManagementObjectSearcher(manage);
                ManagementObjectCollection collection = searcher.Get();
                List<string> netWorkList = new List<string>();
                foreach (ManagementObject obj in collection)
                {
                    if (obj["NetConnectionID"].ToString().ToUpper().Contains("AA"))
                    {
                        obj.InvokeMethod("Enable", null);
                    }
                }
    
            }

    这2段code 都很简单,关键是要理解WMI的用法呢。

    优点:使用很方便,只需要查查WMI 中类的参数就好了

    缺点:目前这个方法只能使用在WIN 7中,下午改了很久都没能改成在XP 中运行。

    2.3 使用微软的COM---shell32.dll

    读过我前一篇文章的朋友应该知道,使用VS 自带的dll类库是有问题。我们需要重新下载新的dll文件。如果需要的点击下面的地址:

    猛击Shell32.dll 下载地址

    核心代码如下:

    var shell = (Shell32.IShellDispatch4)new Shell32.ShellClass();//定义
                        Shell32.Folder folder = shell.NameSpace(49);//在控制面板中,获取网络连接这个item
    
                        foreach (Shell32.FolderItem myItem in folder.Items())//遍历网络连接里的所有项,也就是我们看到网络里面的item,比如本地连接,无线网络连接。
                        {if (myItem.Name.Contains("Wireless Network") || myItem.Name.Contains("无线网络"))//查找相关的网络
                            {
                                foreach (Shell32.FolderItemVerb Fib in myItem.Verbs())
                                {
                                    if (Fib.Name == “禁用(&B)”)
                                    {
                                        Fib.DoIt();
                                    }
                                }
                            }
                        }

    上面的myItem.Verbs() 指的是获取所有的网络的状态。比如以下面:

    这里有一个小小的bug是,如果这里的的禁用可能根据不同的OS 具有不同的结果,英文版的是 dis&able.所有这里需要小心点。应该还有更智能的方法,但时间太短了,我没有仔细的研究。

    优点:适合XP 和Win7系统

    缺点:不容易找到。

    2.4 使用devcon工具---devcon.exe

    注意,这个是无需安装的。因为时间关系,没对这个做太多研究。如果你们喜欢的可以研究一下,这个听说专门是为弥补XP 不能使用netsh来使用的。

    猛击下载devcon工具。

    使用方法(使用代码控制在后面)

    1.cmd 导航到 下载后的页面

    2.打开cmd ,输入devcon,如果有下面的devcon usage 那说明就可以开始了。

    3.找出所有的本地网卡。

    Devcon  findall  *

    会列出很多很多的东西,你使用下面的命令进行学习。因为我没做太多的研究对这个,所有有需要的读者 可以自行研究咯。

    devcon help

    4.程序中使用方法

    和第一种方法是一样的,只是第一个参数,你需要些的是devcon的路劲而已。

      string args = "findall *";
                ProcessStartInfo start = new ProcessStartInfo("C:\Documents and Settings\Administrator\Desktop\1.10\TestWifi\i386\devcon.exe", args);
                start.UseShellExecute = false;
                start.CreateNoWindow = true;
                start.Verb = "runas";
                start.RedirectStandardOutput = true;
                Process p = Process.Start(start);
    

     Ok,这样就能输出,有许多功能你们自己研究咯。

    结束语

    希望对大家有帮助,欢迎提问。

    大家 晚安。

    作者:Lanny☆兰东才
    出处:http://www.cnblogs.com/damonlan
    Q Q:*********
    E_mail:Damon_lan@163.com or Dongcai.lan@hp.com

    本博文欢迎大家浏览和转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,在『参考』的文章中,我会表明参考的文章来源,尊重他人版权。若您发现我侵犯了您的版权,请及时与我联系。

  • 相关阅读:
    作为管理者的基本职责
    websocket接口自动化的封装
    locust性能测试的使用
    git的协作提交流程
    关于接口自动化的实施步骤
    K8S的组件梳理
    jenkins pipeline中,失败后获取异常不中断业务
    pipline在执行的docker镜像中添加hosts
    sonar搭建
    django
  • 原文地址:https://www.cnblogs.com/damonlan/p/2967186.html
Copyright © 2011-2022 走看看