一。場景回顧:
寫這篇文章的主要原因是這些天,因為客戶那邊的需求,而更改的一個需求。在這過程中,翻閱了很多的資料,發現了幾種方法,所以把一些我知道的方法貼出來,以饗讀者。希望你們喜歡。
二。解決方案
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,這樣就能輸出,有許多功能你們自己研究咯。
結束語
希望對大家有幫助,歡迎提問。
大家 晚安。