代码改变世界

通过程序启用/禁用 网络连接(提供4种思路 你值得拥有)

2013-03-19 00:20  随风浪迹天涯  阅读(3561)  评论(7编辑  收藏  举报

一。场景回顾:

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

二。解决方案

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,这样就能输出,有许多功能你们自己研究咯。

结束语

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

大家 晚安。