通过程序启用/禁用 网络连接(提供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 = true和StreamReader 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文件。如果需要的点击下面的地址:
核心代码如下:
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来使用的。
使用方法(使用代码控制在后面)
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,这样就能输出,有许多功能你们自己研究咯。
结束语
希望对大家有帮助,欢迎提问。
大家 晚安。
出处:http://www.cnblogs.com/damonlan
Q Q:*********
E_mail:Damon_lan@163.com or Dongcai.lan@hp.com
本博文欢迎大家浏览和转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,在『参考』的文章中,我会表明参考的文章来源,尊重他人版权。若您发现我侵犯了您的版权,请及时与我联系。